在 webapi 中设置状态代码和内容
Set status-code and content in webapi
我想通过设置状态代码获得一个漂亮而简单的 API 并获得 swagger (swashbuckle) 的文档
首先,我的控制器是这样的:
public class ValuesController : ControllerBase
{
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(List<Value>))]
[HttpGet, System.Web.Mvc.Route("api/values/")]
public async Task<List<Value>> GetValues(HttpRequestMessage request)
{
using (DatabaseContext context = new DatabaseContext())
{
return await context.Values.Take(10).ToListAsync();
}
}
}
一切正常,Swagger 显示 json 格式的结果。问题是,我无法设置状态代码(例如,如果数据库错误我可以设置为 Err 500 或 s.th)。
Here 我读到,为了设置状态码,我们需要 return 一个 HttpResponseMessage
所以我修改了我的代码:
public class ValuesController : ControllerBase
{
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(HttpResponseMessage))]
[HttpGet, System.Web.Mvc.Route("api/values/")]
public async Task<HttpResponseMessage> GetValues(HttpRequestMessage request)
{
using (DatabaseContext context = new DatabaseContext())
{
var valuesToReturn = await context.Values.Take(10).ToListAsync();
return request.CreateResponse(HttpStatusCode.NotModified, valuesToReturn);
}
}
}
现在状态码设置正确,但是swagger没有显示任何结果。
所以,我认为这可能是一个招摇的问题。
下一步是使用 Chromes Boomerang-Plugin 测试 API,但相同:
Status-Code 为 304,但正文 (result/content) 为空:
肯定有结果:
知道如何使用 HttpResponseMessage 正确设置正文吗?
或者,当 return 值为例如时,关于如何在 api 方法中设置状态代码的任何想法List<Value>
?
var valuesToReturn = new List<string>();
valuesToReturn.Add("test01");
var res = new HttpResponseMessage()
{
Content = new StringContent(JsonConvert.SerializeObject(valuesToReturn), Encoding.UTF8, "application/json"),
StatusCode = HttpStatusCode.Redirect
};
return res;
Rawitas Krungkaews 的回答部分正确。
但是,您应该使用通用的 ObjectContent
而不是 StringContent
:
var res = new HttpResponseMessage()
{
Content = new ObjectContent<List<Value>>(valuesToReturn, DefaultJsonFormatter),
StatusCode = HttpStatusCode.Redirect
};
return res;
参数Default
是MediaTypeFormatter。我认为您可以在 class 中声明它,例如:
private static readonly MediaTypeFormatter DefaultJsonFormatter
= new JsonMediaTypeFormatter();
起初 HTTP 状态代码 304 没有 body。
304 响应不得包含 message-body,因此总是以 header 字段后的第一个空行终止。
只需更改状态代码即可。
我想通过设置状态代码获得一个漂亮而简单的 API 并获得 swagger (swashbuckle) 的文档
首先,我的控制器是这样的:
public class ValuesController : ControllerBase
{
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(List<Value>))]
[HttpGet, System.Web.Mvc.Route("api/values/")]
public async Task<List<Value>> GetValues(HttpRequestMessage request)
{
using (DatabaseContext context = new DatabaseContext())
{
return await context.Values.Take(10).ToListAsync();
}
}
}
一切正常,Swagger 显示 json 格式的结果。问题是,我无法设置状态代码(例如,如果数据库错误我可以设置为 Err 500 或 s.th)。
Here 我读到,为了设置状态码,我们需要 return 一个 HttpResponseMessage
所以我修改了我的代码:
public class ValuesController : ControllerBase
{
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(HttpResponseMessage))]
[HttpGet, System.Web.Mvc.Route("api/values/")]
public async Task<HttpResponseMessage> GetValues(HttpRequestMessage request)
{
using (DatabaseContext context = new DatabaseContext())
{
var valuesToReturn = await context.Values.Take(10).ToListAsync();
return request.CreateResponse(HttpStatusCode.NotModified, valuesToReturn);
}
}
}
现在状态码设置正确,但是swagger没有显示任何结果。
所以,我认为这可能是一个招摇的问题。
下一步是使用 Chromes Boomerang-Plugin 测试 API,但相同: Status-Code 为 304,但正文 (result/content) 为空:
肯定有结果:
知道如何使用 HttpResponseMessage 正确设置正文吗?
或者,当 return 值为例如时,关于如何在 api 方法中设置状态代码的任何想法List<Value>
?
var valuesToReturn = new List<string>();
valuesToReturn.Add("test01");
var res = new HttpResponseMessage()
{
Content = new StringContent(JsonConvert.SerializeObject(valuesToReturn), Encoding.UTF8, "application/json"),
StatusCode = HttpStatusCode.Redirect
};
return res;
Rawitas Krungkaews 的回答部分正确。
但是,您应该使用通用的 ObjectContent
而不是 StringContent
:
var res = new HttpResponseMessage()
{
Content = new ObjectContent<List<Value>>(valuesToReturn, DefaultJsonFormatter),
StatusCode = HttpStatusCode.Redirect
};
return res;
参数Default
是MediaTypeFormatter。我认为您可以在 class 中声明它,例如:
private static readonly MediaTypeFormatter DefaultJsonFormatter
= new JsonMediaTypeFormatter();
起初 HTTP 状态代码 304 没有 body。 304 响应不得包含 message-body,因此总是以 header 字段后的第一个空行终止。
只需更改状态代码即可。