尝试使用 WebClient 将空正文传递给 POST 端点

Posted

技术标签:

【中文标题】尝试使用 WebClient 将空正文传递给 POST 端点【英文标题】:Attempting to pass empty body to POST endpoint with WebClient 【发布时间】:2021-12-19 13:07:52 【问题描述】:

我目前在我的项目中有一个端点:

[HttpPost("process")]
public IActionResult Process (string Val1, [FromBody] object Json)

     //processing.....

     Return Ok(...);  

在我的客户端,我尝试使用 WebClient 调用此端点,如下所示:

string response = null;

string body = "";

using (var client = new WebClient())

     client.UserDefaultCredentials = true;
     client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");

     response = client.UploadString("localhost:55555/api/process?Val1=Param", body);

这是我担心的地方:

对于这个端点,我通常会传递一个 JSON 对象

但是,我希望这个端点也不需要正文,我希望它为空,因为端点不应该需要它

如果您查看我的 body 变量 - 我将其设置为“”,否则我没有找到将“EMPTY”正文传递给端点的不同方法

问题:

如何正确地将 EMPTY 正文传递到此端点? (这个端点将被不同的客户使用,我只是在寻找最佳实践方法?

在我的端点中,我有 [FromBody] object Json 参数。将其设置为 object 是更好的做法吗,或者我可以选择使用仍然可以接受空主体的 JObject

如果这些问题看起来很明显,请原谅我的“菜鸟”,我刚刚开始 API 开发,并希望确保我使用的是最佳实践。

【问题讨论】:

【参考方案1】:

您当前正在使用 WebClient,它已过时支持 HttpClient(请参阅此answer)。使用 HttpClient 时,您可以按如下方式发布空正文:await client.PostAsync("localhost:55555/api/process?Val1=Param", null);

关于你的第二个问题。查看Data Transfer Objects,又名 DTO。简而言之,它们是愚蠢的类型,您可以纯粹用于通过 API 传递和接收数据,您也可以向它们添加验证等内容。只有在接收动态数据时才需要使用 object 或 JObject,否则请尽可能使用 DTO。

【讨论】:

以上是关于尝试使用 WebClient 将空正文传递给 POST 端点的主要内容,如果未能解决你的问题,请参考以下文章

使用 @Query JPA 注释将空参数传递给本机查询

将空值作为参数传递给方法时如何修复 NullPointerException [重复]

将空列表作为参数传递给 JPA 查询会引发错误

如何将空参数传递给 msdeploy powershell deploy 命令

如何使用asp.net c#将HTML格式的电子邮件正文传递给javascript函数

如何接收 Post 请求正文并将该正文传递给我在环回中的函数