【发布时间】:2020-07-30 03:03:59
【问题描述】:
我们有一个 .netcore 3.1 ApiController,其端点监听 PATCH 请求,并定义了一个用于集成/API 测试的测试服务器。
使用 Postman 发送的 PATCH 请求可以正常工作,但通过 XUnit 测试中的 HttpClient 发送的请求失败并显示 415 Unsupported media type。
邮递员补丁请求: 除了 Bearer 令牌和 Content-Type:“application/json”
在测试中,我们使用 WebApplicationFactory 和它的 factory.CreateClient() 用于我们的 HttpClient。
这应该不是 Json 序列化的问题,因为我通过调试器查看了内容,并且它似乎被序列化得很好。
此外,我们的 POST 方法使用完全相同的代码完全开箱即用(将“PATCH”替换为“POST”等)
期待一些建议。另外,如果您需要更多信息,请告诉我。非常感谢。
控制器:
[HttpPatch("{id}")]
public async Task<ActionResult<Unit>> Edit(Edit.Command request)
{
return await Mediator.Send(request);
}
命令:
public class Command : IRequest
{
public string Id { get; set; }
public JsonPatchDocument<ObjectDTO> PatchDocument { get; set; }
}
测试:
[InlineData(/* inline data goes here */)]
public async void TestEdit_Ok(/* required parameters for the test */)
{
var request = new HttpRequestMessage(new HttpMethod("PATCH"), url));
request.Headers.Add("Authorization", "Bearer " + token);
/* create patch document logic goes here */
var command = new Command()
{
Id = target,
PatchDocument = patchDocument,
};
_testHelper.AddJsonContent(request, command);
// Act
var response = await _client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
其中帮助方法AddJsonContent定义为:
public void AddJsonContent(HttpRequestMessage request, object content)
{
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string serializedContent = JsonConvert.SerializeObject(content);
request.Content = new StringContent(serializedContent, Encoding.UTF8, "application/json");
}
【问题讨论】:
-
如何配置
WebApplicationFactory?你使用Startup吗?它有什么作用?WebApplicationFactory可能未配置为默认处理PATCH -
您没有指定服务器接受的 Content-Type。使用 Post 和 Patch,您应该指定从客户端发送到服务器的请求的媒体类型。您只是指定了客户对响应的期望的接受。我认为默认情况下邮递员正在发送应用程序/json。但是请尝试以与添加 Accept 添加 Content-Type 相同的方式以编程方式执行此操作并让我知道
标签: c# patch asp.net-core-3.1 json-patch http-status-code-415