This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-docs.git


The following commit(s) were added to refs/heads/master by this push:
     new ae84da7  增加扩展produceProcessor章节
ae84da7 is described below

commit ae84da78a1066198b603afd9f7b05c083852fe68
Author: weichao <[email protected]>
AuthorDate: Fri Jun 29 11:31:35 2018 +0800

    增加扩展produceProcessor章节
---
 java-chassis-reference/zh_CN/SUMMARY.md            |  1 +
 .../zh_CN/build-provider/protocol.md               |  9 ---
 .../zh_CN/build-provider/protocol/thread-model.md  |  2 +-
 .../zh_CN/general-development/produceprocess.md    | 91 ++++++++++++++++++++++
 4 files changed, 93 insertions(+), 10 deletions(-)

diff --git a/java-chassis-reference/zh_CN/SUMMARY.md 
b/java-chassis-reference/zh_CN/SUMMARY.md
index ed68d3c..0b89792 100644
--- a/java-chassis-reference/zh_CN/SUMMARY.md
+++ b/java-chassis-reference/zh_CN/SUMMARY.md
@@ -55,6 +55,7 @@
   * [跨应用调用](general-development/cross-app-invocation.md)
   * [定制序列化和反序列化方法](general-development/secret-field.md)
   * [使用Context传递控制消息](general-development/context.md)
+  * [返回值序列化扩展](general-development/produceprocess.md)
 * [服务能力开放](edge/open-service.md)
   * [使用Edge Service做边缘服务](edge/by-servicecomb-sdk.md)
   * [使用confd和Nginx做边缘服务](edge/nginx.md)
diff --git a/java-chassis-reference/zh_CN/build-provider/protocol.md 
b/java-chassis-reference/zh_CN/build-provider/protocol.md
index a4b2ea7..ea9b9b7 100644
--- a/java-chassis-reference/zh_CN/build-provider/protocol.md
+++ b/java-chassis-reference/zh_CN/build-provider/protocol.md
@@ -1,12 +1,3 @@
 ### 概念阐述
 
 
ServiceComb实现了两种网络通道,包括REST和Highway,均支持TLS加密传输。其中,REST网络通道将服务以标准RESTful形式发布,调用端兼容直接使用http
 client使用标准RESTful形式进行调用。
-
-### 注意事项
-
-参数和返回值的序列化:
-
-当前REST通道的body参数只支持application/json序列化方式,如果要向服务端发送form类型的参数,那么需要在调用端构造好application/json格式的body,不能直接以multipart/form-data格式传递form类型参数。
-
-当前REST通道返回值支持application/json和text/plain两种格式,服务提供者通过produces声明可提供序列化能力,服务消费者通过请求的Accept头指明返回值序列化方式,默认返回application/json格式的数据。
-
diff --git 
a/java-chassis-reference/zh_CN/build-provider/protocol/thread-model.md 
b/java-chassis-reference/zh_CN/build-provider/protocol/thread-model.md
index 9d9e594..c8787d2 100644
--- a/java-chassis-reference/zh_CN/build-provider/protocol/thread-model.md
+++ b/java-chassis-reference/zh_CN/build-provider/protocol/thread-model.md
@@ -22,4 +22,4 @@ servicecomb:
   executors:
     Provider:
       [schemaId].[operation]
-```
+```
\ No newline at end of file
diff --git a/java-chassis-reference/zh_CN/general-development/produceprocess.md 
b/java-chassis-reference/zh_CN/general-development/produceprocess.md
new file mode 100644
index 0000000..fae6796
--- /dev/null
+++ b/java-chassis-reference/zh_CN/general-development/produceprocess.md
@@ -0,0 +1,91 @@
+# 返回值序列化扩展
+## 概念阐述
+
+当前REST通道返回值支持application/json和text/plain两种格式,支持开发人员扩展和重写,服务提供者通过produces声明可提供序列化能力,服务消费者通过请求的Accept头指明返回值序列化方式,默认返回application/json格式的数据。
+
+## 开发说明
+
+* ### 扩展
+
+  开发人员可以根据业务需要,通过编程的方式来扩展返回值序列化方式。实施步骤如下,以扩展支持application/xml格式为例:
+  1.实现接口`ProduceProcessor`
+
+  > getName\(\)返回当前扩展的数据类型名
+  >
+  > getOrder\(\)返回当前数据类型优先级,有多个同名实现类时生效,只加载优先级最高的,数字越小优先级越高
+  >
+  > doEncodeResponse\(OutputStream output, Object 
result\)把result对象编码成output,此处逻辑需要自行实现
+  >
+  > doDecodeResponse\(InputStream input, JavaType 
type\)把input解析成相应对象,此处逻辑需要自行实现
+
+* ```java
+  public class ProduceAppXmlProcessor implements ProduceProcessor {
+
+    @Override
+    public String getName() {
+      return MediaType.APPLICATION_XML;
+    }
+
+    @Override
+    public int getOrder() {
+      return 0;
+    }
+
+    @Override
+    public void doEncodeResponse(OutputStream output, Object result) throws 
Exception {
+      output.write(JAXBUtils.convertToXml(result).getBytes());
+    }
+
+    @Override
+    public Object doDecodeResponse(InputStream input, JavaType type) throws 
Exception {
+      return JAXBUtils.convertToJavaBean(input, type);
+    }
+  }
+  ```
+
+  2.添加配置文件
+
+  
在resources下META-INF/services/文件夹新建文件xxx.ProduceProcessor(xxx为接口的包名),内容填写xxx.ProduceAppXmlProcessor(xxx为实现类的包名)。
+
+* ### 重写
+
+  
开发人员可以对现有的application/json和text/plain两种格式实现逻辑进行重写,也可以对自行扩展的格式进行重写,以重写xml序列化方式为例:
+
+  1.创建一个同名类`ProduceAppXmlProcessor`,实现接口`ProduceProcessor`
+
+  2.重写`doEncodeResponse`和`doDecodeResponse`方法里的编解码逻辑
+
+  3.更改getOrder方法里的返回值,要比原方法的返回值小,例如返回-1,application/json和text/plain的原方法返回值默认都为0
+
+  
4.在resources下META-INF/services/文件夹新建文件xxx.ProduceProcessor(xxx为接口的包名),内容填写xxx.ProduceAppXmlProcessor(xxx为实现类的包名)。
+
+* ### 验证
+
+  服务提供者通过produces声明可提供xml序列化能力
+
+  ```java
+    @RequestMapping(path = "/appXml", method = RequestMethod.POST, produces = 
MediaType.APPLICATION_XML_VALUE)
+    public JAXBPerson appXml(@RequestBody JAXBPerson person) {
+      return person;
+    }
+  ```
+
+  服务消费者通过请求的Accept头指明返回值xml序列化方式
+
+  ```java
+    private void testCodeFirstAppXml(RestTemplate template, String 
cseUrlPrefix) {
+      JAXBPerson person = new JAXBPerson("jake", 22, "it", "60kg");
+      person.setJob(new JAXBJob("developer", "coding"));
+      HttpHeaders headers = new HttpHeaders();
+      headers.add("Accept", MediaType.APPLICATION_XML_VALUE);
+      HttpEntity<JAXBPerson> requestEntity = new HttpEntity<>(person, headers);
+      ResponseEntity<JAXBPerson> resEntity = template.exchange(cseUrlPrefix + 
"appXml",
+          HttpMethod.POST,
+          requestEntity,
+          JAXBPerson.class);
+      TestMgr.check(person, resEntity.getBody());
+    }
+  ```
+
+
+

Reply via email to