我如何使用多种简单类型 PostAsync()?

Abo*_*udi 1 c# asp.net-web-api

我如何使用多个简单类型作为参数 PostAsync(),我有下面的动作控制器:

[HttpPost]
[Route("users/verifyLoginCredentials/{username}/{password}")]
public IHttpActionResult VerifyLoginCredentials([FromUri]string username, string password)
{

   //Do Stuff......
   return Ok("Login Successful");

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试从 .Net Framerwork 4.5 客户端应用程序调用它,如下所示:

static async Task<Uri> CreateProductAsync(string username, string password)
{


     HttpClient client = new HttpClient();
     client.BaseAddress = new Uri(uri);
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
     client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

     var value = new Dictionary<string, string>
     {
        { "username", "test123" }
     };

     var content = new FormUrlEncodedContent(value);
     var result = await client.PostAsync("users/verifyLoginCredentials/{username}/{password}", content);
     string resultContent = await result.Content.ReadAsStringAsync();

     result.EnsureSuccessStatusCode();

     // return URI of the created resource.
     return result.Headers.Location;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试了多种方法,并且最近阅读了很多 在这里

我知道处理复杂类型比处理简单类型更容易,并且默认情况下复杂类型被编码到请求正文/内容中,而简单类型被编码到 URI 中。

我试图通过发送使用编码的键/值对来发布数据 FormUrlEncodedContent(string)通过发送 JsonStringContent(),我尝试过使用单个和多个参数,但我知道现在限制仅适用于复杂类型。

我已经阅读了许多 MSDN 帖子和教程,也许我遗漏了一条重要信息。

上面的控制器操作确实会被执行,但两个参数的字符串值为“{username}”和“{password}”

SO *_*ood 7

当你写

[Route("users/verifyLoginCredentials/{username}/{password}")]
Run Code Online (Sandbox Code Playgroud)

您说的是“按照指定的顺序,从 Uri 匹配用户名和密码参数”,因此您通过 POST 正文发送的任何内容都将被忽略。

您明确地将 {username} 和 {password} 作为参数传递:

var result = await client.PostAsync("users/verifyLoginCredentials/{username}/{password}", content);
Run Code Online (Sandbox Code Playgroud)

你应该这样做:

var message = new HttpRequestMessage(HttpMethod.Post, "users/verifyLoginCredentials/username/test123");
var result = await client.SendAsync(message);
string resultContent = await result.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

如果要将数据作为正文而不是 URL 的一部分发布,请使用以下命令:

[Route("users/VerifyLoginCredentials")]
public IHttpActionResult VerifyLoginCredentials(string username, string password)

 var value = new Dictionary<string, string>
 {
    { "username", "yourUsername" },
    { "passwird", "test123" }
 };

 var content = new FormUrlEncodedContent(value);
 var result = await client.PostAsync("users/verifyLoginCredentials/", content);
 string resultContent = await result.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)