当前位置: 首页 > 知识库问答 >
问题:

错误响应中的REST-API不同内容类型

鲜于光辉
2023-03-14

几周以来,我一直在使用Spring-MVC开发一个rest api。REST-API工作正常,我几乎完成了最后一个问题,当涉及到对特定错误对象的错误处理时。

REST-API使用JSON作为序列化Java-Objects的格式。当服务执行过程中发生错误时,将创建一个特定的错误对象并将其发送回客户机。

当我的REST服务被标记为“produces=application/json”时,一切都很好。但是也有一些服务只需要使用“produces=text/plain”返回简单的文本。当这些服务中的一个发生错误时,Spring-MVC将抛出HttpMediatypeNotAcceptableException。似乎是正确的,因为客户端请求内容类型为“text/plain”,而服务器响应为“application/json”。

你能告诉我这道题的正确解法是什么吗?

>

  • 只使用JSON作为响应内容类型,并且总是在一个特殊的类对象中包装简单的文本。=>在我看来并不像REST那样,因为REST应该支持多种内容类型。

    每个为“text”服务的服务都将标记为“produces=application/json;text/plain”,客户机还需要在“accept-header”中发送这两个服务。=>这样做时,API似乎支持同一资源的两种内容类型。但那是不对的。只有在出现错误时,API才会返回JSON,否则它将始终是“文本”。

    对我来说,听起来像是一个非常特别的Rest问题,找不到这个主题的相关问题。

  • 共有1个答案

    蓬思博
    2023-03-14

    我也面临着同样的问题,对于REST最佳实践我也有同样的问题。

    我读到的关于处理API响应中的错误的所有文章都使用JSON。这里的例子。

    我不认为所有这些API都将数据封装在JSON中。有时您只需要提供文件、文本或非JSON的东西...另外,我偶然发现了RFC7807,它提出了一种使用JSON格式公开错误/探查的标准方法,甚至使用它自己的内容类型Application/Problem+JSON。因此,我们可以有把握地假设,对HTTP 200使用不同于HTTP错误代码的内容类型是一个很好的做法。

    关于如何用Spring框架来做,其实很简单。一旦您理解了“produces={}”基本上是一种声明性的方式来表示您的响应将是某种类型,您就可以想象,通过编程方式设置您想要返回的类型也是可能的。

    下面是一个应该返回application/octet-stream(二进制文件)的示例API。

    @GetMapping(path = "/1/resources/hello", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
    public ResponseEntity<StreamingResponseBody> getFile(@RequestParam(value = "charset", required = false, defaultValue = "UTF-8") String charset) {
        return ResponseEntity.ok().body(outputStream -> outputStream.write("Hello there".getBytes(Charset.forName(charset))));
    }
    

    当它工作时,它将返回一个具有正确内容类型的文件。现在,如果您想要处理错误情况(在本例中是错误的charset参数),您可以创建一个异常处理程序:

    @ExceptionHandler(UnsupportedCharsetException.class)
    public ResponseEntity<?> handleCharsetException(UnsupportedCharsetException e) {
        return ResponseEntity.badRequest().contentType(MediaType.APPLICATION_JSON_UTF8).body(new ErrorResponse("1", "Wrong charset"));
    }
    

    而现在,错误情况也如预期的那样工作:

    GET http://localhost/1/resources/hello?charset=CRAP
    
    HTTP/1.1 400 Bad Request
    Connection: keep-alive
    Transfer-Encoding: chunked
    Content-Type: application/json;charset=UTF-8
    Date: Mon, 25 Mar 2019 17:37:39 GMT
    
    {
      "code": "1",
      "message": "Wrong charset"
    }
    
     类似资料:
    • 遵循我正在测试的请求:curl-x GET\'http://localhost:8080/credits/v1/rating?client_cpf_cnpj=11111111111'\-h'accept:application/xml'\-h'cache-control:no-cache'\-h'content-type:application/xml'

    • Spring Boot中REST APIendpoint(控制器类或方法)上的响应内容类型可以使用@Produces注释进行设置。是否有一种方法可以将此应用程序wide设置为REST API中每个endpoint的默认值?例如,与其在每个控制器类或endpoint上编写@produces(“application/json”),还可以在入口应用程序类上设置它吗?或者有没有其他方法来配置默认值,直到

    • API的成功响应具有json格式(基于avro模式)。对于错误,它是否应该为异常定义另一种格式(模式)?或者成功的响应应该包括错误部分?发生错误时,将其他部分留空,只填充错误。 这更像是一个内部应用编程接口,需要定义各种自定义异常消息。它是否应该对所有此类应用程序错误使用相同的HTTP状态代码? 这些决定如何影响OPEN API(SWAGGER)?

    • 我们公司有两个jira装置。一个用于我们的项目,另一个用于测试目的。 我在一个需要使用JIRA REST应用编程接口的项目中工作。为此,我连接到我们的测试实例。 问题是,在尝试REST API时,我不断收到400个错误,而没有一个错误的解释。我只是得到了一个HTML 您的浏览器发送了此服务器无法理解的请求 我有点绝望,决定把它放进我们真正的JIRA。令我惊讶的是,同样的要求给了我不同的回应: 在这

    • 问题内容: 我是春季新手,正在编写REST API。我/要删除时收到403禁止的错误。以下是我正在研究的示例。 问题答案: 只需在web.xml中添加这些过滤器行即可。

    • 我是spring的新手,我正在编写REST API。我/得到了403个删除,放入的禁止错误。下面是我正在做的样本。