为什么我的HTTP POST正文内容被接收/处理为NULL?

时间:2019-04-30 08:17:00

标签: c# http post

我希望能够在REST API的POST函数定义中接收POST请求的主体内容。

我有一个客户端代码,该代码将C#对象转换为JSON,然后将其包装在HTTP StringContent中。然后,此有效负载通过HTTP Post请求发送到URL。但是,当我尝试返回接收到的字符串时,API中的Post方法始终返回NULL。

客户:

public async void Register_Clicked(object sender, EventArgs e) // When user enters the Register button
{
 Sjson = JsonConvert.SerializeObject(signup);   
 var httpContent = new StringContent(Sjson);    
 using (HttpClient client = new HttpClient())
     {
        client.BaseAddress = new Uri("https://apiname.azurewebsites.net");
        var response =  await client.PostAsync("api/values", httpContent);    
        var responseContent =  await response.Content.ReadAsStringAsync();

        StatusLabel.Text = responseContent; //To display response in client
     }
}

API POST定义:

[SwaggerOperation("Create")]
[SwaggerResponse(HttpStatusCode.Created)]
public string Post([FromBody]string signup)
{
      return signup;
}

我希望客户端输入作为响应显示在客户端(StatusLabel.Text)中。 但是我收到的只是NULL 。请指引我正确的方向。

1 个答案:

答案 0 :(得分:0)

我准备了一个简单的示例,说明如何从Result检索Task

async Task<string> GetResponseString(SigupModel signup)
{
  Sjson = JsonConvert.SerializeObject(signup);   
  var httpContent = new StringContent(Sjson);    
  using (HttpClient client = new HttpClient())
   {
     client.BaseAddress = new Uri("https://apiname.azurewebsites.net");
     var response =  await client.PostAsync("api/values", httpContent);    
     var responseContent =  await response.Content.ReadAsStringAsync();   
   }
 return responseContent;
}

您可以这样称呼它:

Task<string> result = GetResponseString(signup);
var finalResult = result.Result;
StatusLabel.Text = finalResult; //To display response in client

如果您没有使用async关键字,则可以调用Result来获得

var responseContent =  response.Content.ReadAsStringAsync().Result;

编辑

基本上,您必须将signup模型发布到API控制器。如果需要,请使用SigupModel signup作为参数。然后,无论您在API中执行什么处理,最终结果都将是一个字符串。现在,此字符串可以为null,空或具有值。当您在客户端中获得此值时,将需要执行以下操作:

var responseContent = await response.Content.ReadAsStringAsync(); 
var message = JsonConvert.DeserializeObject<string>(responseContent); 

在这里,您将获得一个字符串消息,然后可以将其设置为:StatusLabel.Text = message ;