RESTFUL_规范化开发

当一个理论被提出的时候,一个公司的技术决策层通常需要考虑到这个理论的可行性,然后去验证落地的可能性。

我们在实施SOA关于接口的过程中,通常有以下流程:定义规范,然后根据规范去生成服务端客户端代码框架,然后部署到OSB或者其他平台上。在这之前,曾经主导设计了一个REST风格的数字售楼系统,用的是SPIRNGMVC,当然前端有多种,flex,jsp,android等等。但是如今看来,那个系统的设计框架虽然考虑到了安全验证,转码,TOKEN授权机制等等,但是如果做多系统集成,那个框架却忽视了一个很重要的东西--规范。因此我们可以采下面这种开发方式。

一。定义规范,规范的目的就是定义双方交换的数据格式。比如我们定义一个导入数据的规范,ImportAcountInfoSrv.XSD。这个规范里我们定义验证头信息,输入,输出等内容。如下

<importnamespace="http://mss.cmcc.com/MsgHeader"

schemaLocation="MsgHeader.xsd"/>

<importnamespace="http://mss.cmcc.com/ImportSrvResponse"

schemaLocation="ImportSrvResponse.xsd"/>

<elementname="SB_EMT_EMT_ImportAcountInfoSrvRequest"

type="tns:SB_EMT_EMT_ImportAcountInfoSrvRequest"/>

<elementname="SB_EMT_EMT_ImportAcountInfoSrvResponse"

type="tns:SB_EMT_EMT_ImportAcountInfoSrvResponse"/>

.............

二。生成实体类,用JDK自带工具xjc.bat生成实体对象如下:

SBEMTEMTImportAcountInfoSrvRequest.java

SBEMTEMTImportAcountInfoSrvResponse.java

SBEMTEMTImportAcountInfoSrvInputCollection.java

SBEMTEMTImportAcountInfoSrvInputItem.java

.....................

三。编写服务端代码RestController.java

..........

@RequestMapping(method=RequestMethod.POST,

value="/importaccount")

publicResponseEntity<String>importAccountSrv(

@RequestBodyStringbody){

.............

StringReaderreader=newStringReader(body);

Unmarshallerunmar=context.createUnmarshaller();

SBEMTEMTImportAcountInfoSrvRequestsaisr=

(SBEMTEMTImportAcountInfoSrvRequest)

unmar.unmarshal(reader);

..............

Stringres=convertObjToXml(sair);

HttpHeadersresHeaders=newHttpHeaders();

resHeaders.setContentType(MediaType.TEXT_PLAIN);

returnnewResponseEntity<String>(res,resHeaders,

HttpStatus.CREATED);

}

上面的代码关键是JAXB2反解析序列化后字符串,并将数据填充到我们生成的对

象中。同样在返回SBEMTEMTImportAcountInfoSrvResponse对象实例时候

,需要经过JAXB2序列化。

.............

Marshallermarshaller=context.createMarshaller();

..............

StringWriterwriter=newStringWriter();

marshaller.marshal(sair,writer);

Stringxml=writer.toString();

四。编写客户端代码RestClient

rest.postForObject

("http://localhost:8080/SpringRest/service/importaccount",

requestStr,String.class);

其他部分和服务端逆过程即可。

相关推荐