当我发出http put请求时,内容总是为null



我有一个可以工作的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字符串,但也没有成功。

使用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...
}
}

我通过测试发出PUT请求,[FromBody]数据始终为空。

请检查您的RequestData类,并确保您定义了公共属性,如下所示。

public class RequestData
{
public string Content { get; set; }
//...
//other properties

如果将它们定义为不带getset访问器的字段,则可能会导致此问题。

此外,在创建RequestData类的实例并用该request对象填充StringContent时,请检查是否为每个属性分配了值。

var request = new RequestData();
request.Content = "hello world";
//...

最新更新