【问题标题】:Why is my HTTP POST Body content received/processed as NULL?为什么我的 HTTP POST 正文内容被接收/处理为 NULL?
【发布时间】:2019-04-30 19:18:58
【问题描述】:

我希望能够在 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。请指引我正确的方向。

【问题讨论】:

  • 你必须得到你的任务的结果。 var responseContent = await response.Content.ReadAsStringAsync().Result;
  • @Rahul Sharma 当我添加“.Result”时,它触发了以下错误:“字符串”不包含“GetAwaiter”的定义,并且没有可访问的扩展方法“GetAwaiter”接受类型的第一个参数可以找到“字符串”(您是否缺少 using 指令或程序集引用?)
  • 你能告诉我你的客户代码吗?该方法的返回类型是什么?它应该类似于public async Task<string>
  • 我已经在上面的问题中展示了相关的客户端代码。对不起,我不明白 'Task' 指的是什么。你问的是服务器的返回类型吗?

标签: c# http post


【解决方案1】:

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

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 关键字,那么您可以调用 get your Result as:

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

编辑

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

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

在这里你会得到一个字符串,然后你可以将它设置为:StatusLabel.Text = message ;

【讨论】:

  • 我无法编辑我的问题以向您展示更大的图景。它会变成很多代码,我可能会被标记。无论如何,客户端代码位于 switch 语句中,而 switch 语句又位于 Xamarin.Forms Button Click 偶数处理程序中。我尝试用你的代码替换我的代码,请求 POST 后应用程序崩溃
  • 您可以开始聊天讨论。
  • 我的声望为 '1',所以不能聊天是吗?对不起。生病编辑问题。立即查看...
  • 不确定,你可以查一下我的用户名。我注意到的另一件事是,在您的客户中,您正在发布您的注册模型。所以你的服务器需要一个注册类型的模型。应该是:public string Post([FromBody] Signup signup)
  • 值得将注册对象成功设置为用户输入,并且可以毫无问题地转换为 JSON。问题是在 API 的 HTTP 定义中访问此有效负载。那里总是 NULL...
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2012-10-31
  • 2017-01-20
相关资源
最近更新 更多