当我发出 http put 请求时,内容始终为空
Posted
技术标签:
【中文标题】当我发出 http put 请求时,内容始终为空【英文标题】:Content is always null when I make a http put request 【发布时间】:2021-04-28 17:33:58 【问题描述】:我有一个可以工作的 Web API。现在我正在为其编写集成测试,但是当我通过测试发出 PUT 请求时,[FromBody]
数据始终为空。 RequestData
是我创建的一个 protobuf 类型。
这是 API 方法的签名:
public async Task<Response> SomePutMethod(string id, [FromBody] RequestData data)
在我的测试中,我这样称呼它:
var request = new RequestData()
HttpContent content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var putResult = await _client.PutAsync(uri + "?id=1", content);
我还尝试Jsonformatter.Default.Format
将 protobuf 对象转换为 json 字符串,但这也不起作用。
【问题讨论】:
嗨@an007,有关于这个案例的最新消息吗? 【参考方案1】:使用来自System.Net.Http.Formatting.HttpClientExtensions
的扩展名PutAsJsonAsync()
:
var data = new RequestData();
var resp = await _client.PutAsJsonAsync("https://www.example.com", data);
或者,使用SendAsync()
using(var req = new HttpRequestMessage(HttpMethod.Put, "https://www.example.com/"))
req.Headers.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
req.Content = new StringContent(JsonConvert.SerializeObject(request),
Encoding.UTF8, "application/json");
using(var resp = await _client.SendAsync(req))
resp.EnsureSuccessStatusCode();
resp.Content.ReadAs...
【讨论】:
它仍然为空。双向 如果端点被命中并且正文为空,那么您的模型不匹配。真的没有其他方法可以完成您正在尝试做的事情。您在问题中说端点有效,只是在编写测试以使用它时无效。 那么他们为什么不匹配?我做错了什么【参考方案2】:我通过测试发出PUT请求,
[FromBody]
数据始终为空。
请检查您的 RequestData
类并确保您定义了公共属性,如下所示。
public class RequestData
public string Content get; set;
//...
//other properties
如果您将它们定义为没有 get
和 set
访问器的字段,这可能会导致问题。
此外,请检查您在创建RequestData
类的实例并使用该request
对象填充StringContent
时是否为每个属性分配了值。
var request = new RequestData();
request.Content = "hello world";
//...
【讨论】:
以上是关于当我发出 http put 请求时,内容始终为空的主要内容,如果未能解决你的问题,请参考以下文章
MERN API 请求,不知道如何发出 put 请求并正确更新
当连接是移动数据 xamarin 表单时,无法在服务器上发出 Put 和 Post 请求