首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web Api:推荐的json字符串返回方式

Web Api:推荐的json字符串返回方式
EN

Stack Overflow用户
提问于 2016-11-28 03:45:13
回答 4查看 37.6K关注 0票数 8

我有几个服务已经接收了必须返回给客户端的json字符串(而不是对象)。目前,我正在显式创建HttpResponseMessage,并将其Content属性设置为服务接收的json字符串:

代码语言:javascript
复制
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonUtilizadores, Encoding.UTF8, "application/json");
return response;

现在,有没有更好的方法来用新的IHttpActionResult来做到这一点呢?使用ContentOk方法的结果是用引号将json字符串括起来,这不是我想要的。

有什么反馈吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-28 10:39:45

创建自定义实现。该框架可通过IHttpActionResult进行扩展。

下面创建一个自定义结果和扩展方法...

代码语言:javascript
复制
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<HttpResponseMessage> 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;
        }
    }
}

然后,可以将...that应用于ApiController派生类。大大简化了之前对

代码语言:javascript
复制
return this.JsonString(jsonUtilizadores); //defaults to 200 OK

或使用所需的HTTP状态代码

代码语言:javascript
复制
return this.JsonString(jsonUtilizadores, HttpStatusCode.BadRequest);
票数 11
EN

Stack Overflow用户

发布于 2016-11-28 11:56:42

设置您的Web Api返回JSON格式:

代码语言:javascript
复制
    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);
    }

然后像这样返回响应:

代码语言:javascript
复制
        [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是下一个类:

代码语言:javascript
复制
 public class ResponseStatus
    {
        public string Status { get; set; }
        public string Message { get; set; }
    }
票数 5
EN

Stack Overflow用户

发布于 2016-11-28 13:08:58

将响应格式留给内容协商,以便与REST兼容,客户端应该决定它想要的格式。

在你的web API操作中,你应该只返回Ok(your object),web API将会看到返回它的最佳格式。

如果您需要省略其他格式化程序,则只需按照Nkosi的建议删除其他MediaTypeFormatter对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40833162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档