我正在测试我的 C# API 端点,发现控制器中返回的状态代码与使用 fetch 收到的状态代码之间存在差异。我已将 C# 控制器配置为在参数值与预期格式不匹配时返回 400 Bad Request。但是,当我使用 fetch 发出包含无效参数的请求时,response.status 显示 422 Unprocessable Entity 而不是 400。
相关代码如下: 在我的 C# API 中,我正在检查类别参数是否有效。如果不是,我会设置带有 400 状态代码的 ProblemDetails 响应。当我填写错误的参数时,它确实返回 400。
if (!string.IsNullOrEmpty(category) && category != "http://terminology.hl7.org/CodeSystem/observation-category|laboratory")
{
return UnprocessableEntity(new ProblemDetails
{
Title = "Ongeldige parameter",
Detail = "De enige toegestane waarde voor 'category' is 'http://terminology.hl7.org/CodeSystem/observation-category|laboratory'.",
Status = 400
});
}
在测试时,我使用 fetch-api 来发出请求。此代码片段显示了我如何发送请求并记录响应状态。
async def make_request(params):
response = await fetch('/api/request', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: document.getElementById('url').value,
params: params
})
})
data = await response.json()
print(response.status) # This shows 422 instead of 400
return {
'status': response.status,
'data': data
}
为什么JavaScript中的response.status显示422而不是400?这是设置自定义状态代码时 UnprocessableEntity 在 C# 中如何工作的问题,还是可能是 JS 中 fetch 实现特有的问题?
您似乎假设传递给
error
的 UnprocessableEntity
对象会以某种方式识别出它是为了替换 HTTP 状态代码。
过载为:
public virtual UnprocessableEntityObjectResult UnprocessableEntity([ActionResultObjectValue] object? error)
仅将
error
参数作为 object
- 即不会有任何特定的语义含义,只会按原样传递到 UI。