API不同的内容

自从几个星期以来,我正在使用spring-mvc工作其余的api。 REST-API工作正常,并且我们几乎完成了直到最后一个问题,当涉及到使用特定错误对象进行错误处理时。

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

当我的休息服务被标记为“produce = application / json”时,一切正常。 但也有一些服务只需要使用“produce = text / plain”返回简单的文本。 当其中一个服务发生错误时,Spring-MVC将抛出一个HttpMediaTypeNotAcceptableException异常。 似乎是正确的原因客户端请求内容类型“文本/纯文本”,但服务器响应“application / json”。

你能告诉我什么是这个问题的正确解决方案吗?

  • 只使用JSON作为响应内容类型并将简单文本包装在特殊的类对象中。 =>对我来说似乎并不像REST那样,导致REST应该支持多种内容类型。

  • 每个服务“文本”的服务都将被标记为“produce = application / json; text / plain”,客户端也需要在“accept-header”中发送。 =>当这样做时,API似乎支持相同资源的两种内容类型。 但那不对。 只有在发生错误的情况下,API才会返回JSON,否则它将始终为“文本”。

  • 听起来像是一个非常特殊的REST问题,无法找到关于此主题的相关问题。


    用户应该始终使用Accept标头指定期望的内容。 您的工作是以Accept头中指定的格式返回在服务器端抛出/捕获的错误。 据我所知,春天可以用特殊的mapper来实现。 下面你可以找到用groovy编写的这样的mapper来处理text/html

    import groovy.xml.MarkupBuilder
    import org.springframework.http.HttpInputMessage
    import org.springframework.http.HttpOutputMessage
    import org.springframework.http.converter.AbstractHttpMessageConverter
    
    import static org.springframework.http.MediaType.TEXT_HTML
    
    class ExceptionResponseHTMLConverter extends AbstractHttpMessageConverter<ExceptionResponse> {
      ExceptionResponseHTMLConverter() {
        super(TEXT_HTML)
      }
    
      @Override
      boolean supports(Class clazz) {
        clazz.equals(ExceptionResponse)
      }
    
      @Override
      ExceptionResponse readInternal(Class clazz, HttpInputMessage msg) {
        throw new UnsupportedOperationException()
      }
    
      @Override
      void writeInternal(ExceptionResponse e, HttpOutputMessage msg) {
        def sw = new StringWriter()
        new MarkupBuilder(sw).error {
          error(e.error)
          exception(e.exception)
          message(e.message)
          path(e.path)
          status(e.status)
          timestamp(e.timestamp)
        }
        msg.body << sw.toString().bytes
      }
    }
    

    ExceptionResponse类:

    class ExceptionResponse {
      String error
      String exception
      String message
      String path
      Integer status
      Long timestamp
    }
    
    链接地址: http://www.djcxy.com/p/48185.html

    上一篇: API Different Content

    下一篇: Type when accessing Domino Access Service via Alamofire in Swift