如何从Http传递多个字符串值.PutAsJsonAsync在Blazor应用程序



我需要张贴两个字符串值来添加一个公司的数据库。这里我把PUT写成

 await Http.PutAsJsonAsync($"api/B2CUsers/company/invitation/add/{UtpID}/{User.email}",UtpID,User.email);

我在User.email处得到一个错误,显示为cannot convert string to System.Text.Json.JsonSerializerOptions

控制器功能:

[HttpPut("company/invitation/add/{utpid}/{emailAddressInvitedUser}")]
        public async Task<int> AddUserCompanyInvitationAsync(string utpid, string emailAddressInvitedUser)
        {
            string userid = GetCurrentUser();
            return await _iB2CUserServiceRepository.AddUserCompanyInvitation(userid, utpid, emailAddressInvitedUser);
        }

注意:通常将单个值传递给Web Api端点,因此您最好定义单个DTO对象,该对象将包含两个字符串的值,如下所示:

var dtoObj = new DtoObject  { UtpID = UtpID, Email = User.email };
       
 using var response = 
    await htpClient.PutAsJsonAsync("api/B2CUsers/company/invitation/add", 
                                                            dtoObj );
 response.EnsureSuccessStatusCode();

注意:你的代码应该定义一个名为DtoObject的对象,它的作用域是你的Web Api和Blazor(也许你可以把它放在共享项目?)

在AddUserCompanyInvitationAsync Web Api方法中,您将获得DtoObject类型的单个参数对象,您可以在代码中这样使用它:

 return await
_iB2CUserServiceRepository.AddUserCompanyInvitation(userid, dtoObj.UtpID , dtoObj.Email);

正确的函数签名是

[HttpGet("company/invitation/add2/{utpid}/{emailAddressInvitedUser}")]
public Task<int> AddUserCompanyInvitationAsync([FromRoute] string utpid, [FromRoute] string emailAddressInvitedUser)

如果你不添加[FromRoute]属性,. net将不会映射路由值到你的变量。

请记住,这种请求将被记录在web服务器的日志中。这意味着电子邮件地址将在日志中可见。您还需要使用HttpUtility转义电子邮件字符串。UrlEncode

curl -X PUT "http://localhost:14786/company/invitation/add2/45/test%40test.com"-H "accept: text/plain">

首选的方法是在body中传递Json请求。

public class AddUserRequest
{
    public int utpid { get; set; }
    public string emailAddressInvitedUser { get; set; }
}
public class AddUserResponse
{
    public int uid { get; set; }
}
[HttpPut("company/invitation/add1")]
public Task<AddUserResponse> AddUserCompanyInvitationAsync([FromBody]AddUserRequest addUserRequest)
{
    Console.WriteLine(addUserRequest.utpid);
    Console.WriteLine(addUserRequest.emailAddressInvitedUser);
    return Task.FromResult(new AddUserResponse() { uid = 1 });
}

和客户端

var client = new HttpClient();
int id = 45;
string email = "test@test.com";
await client.GetAsync($"http://localhost:14786/company/invitation/add2/{id}/{System.Web.HttpUtility.UrlEncode(email)}");
var response = await client.PutAsJsonAsync("http://localhost:14786/company/invitation/add1", new AddUserRequest() { utpid = id, emailAddressInvitedUser = email });

用POST代替PUT

最新更新