You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2019/12/05 06:40:38 UTC

[GitHub] [servicecomb-java-chassis] yhs0092 commented on issue #1441: cse如何对response操作

yhs0092 commented on issue #1441: cse如何对response操作
URL: https://github.com/apache/servicecomb-java-chassis/issues/1441#issuecomment-561994000
 
 
   根据你描述的,你的服务是以Servlet方式开发的吗?在Tomcat之类的web容器里部署,controller的方法定义的参数是 `HttpServletRequest` 和 `HttpServletResponse` ,HTTP请求的参数从 `HttpServletRequest` 里面取,HTTP响应往 `HttpServletResponse` 里面写?
   然而ServiceComb-Java-Chassis 框架是一个REST的微服务框架,设计之初就与OpenAPI契约规范有原生支持,并不是让用户随意收发数据格式的。如果你使用的是 `HttpServletResponse` 来返回HTTP响应,那么框架是无法得知你的返回值的数据类型的,甚至很多这样Servlet方式开发的服务其实接口收发的数据结构也不一定是固定的,这样的接口没法用符合REST规范的契约描述。建议你看一下 [接口定义和数据类型](https://docs.servicecomb.io/java-chassis/zh_CN/build-provider/interface-constraints.html) 这篇文档来了解一下Java-Chassis对于接口定义的约束。所以你看到的Java-Chassis的资料里推荐的接口定义方式都使用的是明确的参数和返回值类型,因为只有这样才能让框架生成明确的服务契约。
   
   至于 ContentType、CharacterEncoding、OutputStream 这些东西,属于传输模块,如果按照Java-Chassis设想的开发方式,传输实现与业务接口定义应该是解耦合的,也不太建议你再手工修改返回值body的码流了,除非你对Java-Chassis、对底层的传输框架都很熟悉,否则太容易碰到问题,这样也很容易跟框架实现耦合起来,加重开发者的负担。
   
   最后,如果你想接收HTTP请求的header,可以参考[这里](https://github.com/apache/servicecomb-java-chassis/issues/1422),从`HttpServerFilter`里面取也行,而自定义不同状态码下的返回值类型的方法、设置特定的response header的方法可以参考Java-Chassis自带的demo,像 `org.apache.servicecomb.demo.jaxrs.server.multiErrorCode.MultiErrorCodeService#errorCodeWithHeader` 和 `org.apache.servicecomb.demo.springmvc.server.CodeFirstSpringmvc#responseEntity` 这样的方式都行。

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services