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());
+ }
+ ```
+
+
+