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);
其他部分和服务端逆过程即可。