Web Api:推荐的返回json字符串的方法
我有几个已经收到必须返回给客户端的json字符串(不是对象)的服务。 目前,我正在显式创建HttpResponseMessage
并将其Content
属性设置为服务接收的json字符串:
var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json"); return response;
现在,使用新的IHttpActionResult
有更好的方法吗? 使用Content
或Ok
方法最终用引号包装json字符串,这不是我想要的。
任何反馈?
创建自定义实现。 该框架可通过IHttpActionResult
扩展。
以下创建自定义结果和扩展方法…
public static class JsonStringResultExtension { public static CustomJsonStringResult JsonString(this ApiController controller, string jsonContent, HttpStatusCode statusCode = HttpStatusCode.OK) { var result = new CustomJsonStringResult(controller.Request, statusCode, jsonContent); return result; } public class CustomJsonStringResult : IHttpActionResult { private string json; private HttpStatusCode statusCode; private HttpRequestMessage request; public CustomJsonStringResult(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode = HttpStatusCode.OK, string json = "") { this.request = httpRequestMessage; this.json = json; this.statusCode = statusCode; } public Task ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(Execute()); } private HttpResponseMessage Execute() { var response = request.CreateResponse(statusCode); response.Content = new StringContent(json, Encoding.UTF8, "application/json"); return response; } } }
…然后可以应用于ApiController
派生类。 大大简化以前的通话
return this.JsonString(jsonUtilizadores); //defaults to 200 OK
或者使用所需的HTTP状态代码
return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest);
设置Web Api以返回JSON格式:
public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); // Force to ignore Request Content Type Header and reply only JSON config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); var corsAttr = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(corsAttr); }
然后像这样返回响应:
[HttpGet] [Route("{taskId}/list")] public IHttpActionResult GetTaskDocuments(string taskId) { var docs = repository.getTaskDocuments(taskId); if (docs != null) { return Ok(docs); } else { return Ok(new ResponseStatus() { Status = Constants.RESPONSE_FAIL, Message = repository.LastErrorMsg }); } }
ResponseStatus是下一个类的地方:
public class ResponseStatus { public string Status { get; set; } public string Message { get; set; } }
将响应格式保留给内容协商以符合REST,客户端应该决定它想要的格式。
在您的Web API操作中,您应该返回Ok(your object)
,Web API将看到返回它的最佳格式。
如果您需要省略其他格式化程序,那么就像Nkosi建议的那样删除其他MediaTypeFormatter
对象。