consumer support application/xml MIME type

举报
艾弗森 发表于 2018/11/01 15:26:00 2018/11/01
【摘要】 1.添加实现类:public class ProduceAppXmlProcessor implements ProduceProcessor { private XmlMapper mapper = new XmlMapper(); @Override public String getName() { return MediaType.APPLICATION_XML; } ...

返回值序列化扩展

概念阐述

当前REST通道返回值支持application/json和text/plain两种格式,支持开发人员扩展和重写,服务提供者通过produces声明可提供序列化能力。

B030版本中通过增加org.apache.servicecomb.common.rest.codec.produce.ProduceXmlProcessor支持返回值为application/xml类型。


验证

下面将通过一个端到端(xmlclient->edge->xmlServer)的demo进行说明及验证


一、定义服务端实现

@RestSchema(schemaId="xml")
@RequestMapping(path = "/XmlTest")
public class SpringmvcXmlImpl implements Xml{
  @RequestMapping(path = "/appXmls", method = RequestMethod.POST,produces = MediaType.APPLICATION_XML_VALUE)
  public String appXmls(@RequestBody String s) {
    return s;
  }
}


二、定义EDGE

1.增加自定义路由机制

public class EdgeDispatcher extends AbstractEdgeDispatcher {
  private CompatiblePathVersionMapper versionMapper = new CompatiblePathVersionMapper();

  @Override
  public int getOrder() {
    return 10000;
  }

  @Override
  public void init(Router router) {
    String regex = "/api/([^\\\\/]+)/(.*)";
    router.routeWithRegex(regex).handler(CookieHandler.create());
    router.routeWithRegex(regex).handler(createBodyHandler());
    router.routeWithRegex(regex).failureHandler(this::onFailure).handler(this::onRequest);
  }

  protected void onRequest(RoutingContext context) {
    Map<String, String> pathParams = context.pathParams();
    String microserviceName = pathParams.get("param0");
    String prefix = "/api/" + microserviceName;
    String path = context.request().path().substring(prefix.length());

    EdgeInvocation edgeInvocation = new EdgeInvocation();

    edgeInvocation.init(microserviceName, context, path, httpServerFilters);
    edgeInvocation.edgeInvoke();
  }
}

2.以SPI的方式在resources下META-INF/services/文件夹新建文件,文件名为org.apache.servicecomb.transport.rest.vertx.VertxHttpDispatcher(SD提供,用于扩展路由策略),内容填写org.apache.servicecomb.demo.xml.edge.EdgeDispatcher(对应自定义路由的完整类名)

三、客户端调用

private static void test6() {
    String body = "<JAXBPerson>" +
        "<name>name</name><age>18</age><role>role</role><weight>111</weight>" +
        "<job><name>nnn</name><content>ccc</content></job>" +
        "</JAXBPerson>";
    String s = invoker.postForObject("http://127.0.0.1:18080/api/xmlprovider/XmlTest/appXmls",
        body,
        String.class);
    System.out.println("springmvc s"+s);
    TestMgr.check(body, s);
  }

四、通过postman验证,header内容如下

image.png

body内容为

<JAXBPerson><name>name</name><age>18</age><role>role</role><weight>111</weight><job><name>nnn</name><content>ccc</content></job></JAXBPerson>

访问http://127.0.0.1:18080/api/xmlprovider/XmlTest/appXmls,结果如下

image.png



注意事项:

1.因为需要声明produces=MediaType.APPLICATION_XML_VALUE,所以不支持POJO方式开发

2.三个微服务的appId必须相同

3.http://127.0.0.1:18080/api/xmlprovider/XmlTest/appXmls,其中18080是edge发布的端口,xmlprovider是服务端微服务名


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。