liubao68 closed pull request #8: 增加Produceprocessor扩展说明
URL: https://github.com/apache/incubator-servicecomb-docs/pull/8
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
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());
+ }
+ ```
+
+
+
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services