我有一个可以工作的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
如果将它们定义为不带get
和set
访问器的字段,则可能会导致此问题。
此外,在创建RequestData
类的实例并用该request
对象填充StringContent
时,请检查是否为每个属性分配了值。
var request = new RequestData();
request.Content = "hello world";
//...