当前位置: 首页 > 知识库问答 >
问题:

ASP Core 2空POST请求

冷俊健
2023-03-14

我有一个简单的HTTP POST请求,我将它发送到一个与Kestrellocalhost运行的ASP Core 2应用程序。接收到的数据总是null,除非我从另一个C#应用程序使用PostAsJsonAsync

我发送的json具有以下格式:

{
  "_isValid": true,
  "_username": "test",
  "_guid": "f3f574eb-5710-43c5-a4ff-0b75866a72a7",
  "_dt": "2018-02-11T15:53:44.6161198Z",
  "_ms": "IsSelected"
  [...]
}

ASP控制器具有以下形式:

// POST: api/NativeClient
[HttpPost]
public async Task<IActionResult> Post([FromBody]string value)
{
   [...]

1.案例:从另一个C#应用程序发送PostAsJsonAsync

在一种情况下,我通过另一个单独的C#应用程序成功发送请求,该应用程序使用PostAsJsonAsync,如下所示:

HttpClient client = new HttpClient();
client.BaseAddress = new System.Uri("http://localhost:51022/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var response = await client.PostAsJsonAsync("/api/NativeClient/", json);

控制器接收呼叫并成功填充

2.案例:使用外部REST客户端(如Postman)发送

在另一种情况下,我尝试通过另一个REST客户端发送请求,例如通过REST客户端扩展的Postman或Visual Studio Code:

POST http://localhost:51022/api/NativeClient/ HTTP/1.1
content-type: application/json; charset=utf-8

{
  "_isValid": true,
  "_username": "gnappo",
  "_guid": "f3f574eb-5710-43c5-a4ff-0b75866a72a7",
  "_dt": "2018-02-11T15:53:44.6161198Z",
  "_ms": "IsSelected"
  [...]
}

在这里,请求由控制器接收,但字符串值始终为null

我尝试过删除[FromBody]标记,检查请求头,检查主体中的json字符串(完全相同),以及下面引用中提到的其他东西,但都不起作用。

我错过了什么?

尝试的其他测试/参考

执行HTTP Post请求时,value始终为空

sp.netCore 2 API POST对象为NULL?

ASP中的模型绑定JSON帖子。网芯


共有2个答案

西门梓
2023-03-14
匿名用户

POST请求需要声明发送的数据为text/普通。使用HttpClient的示例:

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

这样,API将能够以字符串内容的形式接收JSON。

如果您希望接收反序列化到原始模型对象中的内容,则需要将此标头添加到请求中:

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

并将您的控制器更改为:

// POST: api/NativeClient
[HttpPost]
public async Task<IActionResult> Post([FromBody]yourClass class)
{
   [...]

将JSON对象发送到您的API:

var Content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("/api/NativeClient/", Content);

PostAsJsonAsync将C#Object作为输入;它在发送之前将其序列化为JSON字符串。相反,PostAsync可以使用JSON字符串发送。

看到这个问题了吗

有关更多信息,请参阅此链接:

C语言中的后同步#

后同步

常献
2023-03-14

你应该反序列化JSON到某个模型(类),因为我相信你在代码的某个地方反序列化了这个字符串:

public class YourModel
{
    public bool _isValid { get; set; }
    public string _username { get; set; }
    public string _guid { get; set; }
    public DateTime _dt { get; set; }
    public string _ms { get; set; }
    // other properties from json
}

以及你的行动:

[HttpPost]
public async Task<IActionResult> Post([FromBody] YourModel value)

关于您的应用程序:

在应用程序中,您将json作为参数传递给PostAsJsonAsync(),但您需要传递对象,它将被解析为json

var response = await client.PostAsJsonAsync("/api/NativeClient/", yourObject);

yourObject是类的实例,应该解析为JSON

评论后:

此外,请尝试将应用程序代码更改为:

HttpClient client = new HttpClient();
client.BaseAddress = new System.Uri("http://localhost:51022/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var httpContent = new StringContent(json, Encoding.UTF8, "application/json");    
var response = await client.PostAsync("/api/NativeClient/", httpContent);
 类似资料:
  • 问题内容: 所以我在与node.js一起运行的server.js文件中有以下代码。我正在使用express处理HTTP请求。 我在终端中运行以下命令: 运行该server.js后,将输出以下内容。 所以req.body是。我阅读了其他有关类似问题的Stack Overflow帖子,其中由于正文解析器,内容类型不正确。但这不是问题,因为内容类型是application / json。 有什么想法如何

  • 我有麻烦向服务器发出POST请求,我的数据没有发送回我。 我有一个非常简单的PHP脚本: 服务器脚本 我想对这个脚本发出一个POST请求,并获得一些JSON数据作为响应。 工作要求 如果我从HTML发出一个POST请求,这将非常有效: 这也起作用: 响应   不工作脚本(desire):Aurelia提取客户端(JS2016) 提取客户端配置 响应 php备选方案 我尝试在PHP中查看数组内部的内

  • 代码如下: 这将向flask发送一个{“name”:“go”}JSON字典。Flask应该将语言名称追加到数组中,并在响应中返回完整的数组。现在,当我手动发送请求时,这就工作了,所以这不是Flask的错误。但是当我从iOS发送上述内容时,我在flask控制台中得到request.json==None。很明显,我送的是一具空尸体,但我不应该。你知道我哪里出了问题吗?

  • <?php $requestBody = array( 'lang' => 'php', 'ver' => 'any' ); $http = HttpRequest::newSession(); $response = $http->post('http://www.baidu.com/', $requestBody);

  • 我使用的是junit4提供的restassured。在我的测试方法中,我在mongodb中创建了一个对象,当我运行测试时,它也成功地持久化了。但是我需要存储创建的id,所以我尝试获取响应体。但是< code>response.getBody()。asString()为空。 当我从外部调用restendpoint时,它会返回带有相关字段的响应体,因此rest API没有问题。 如果上述问题没有答案,