看到許多中小項(xiàng)目的webservice接口的源代碼,不禁有個(gè)吐槽的沖動(dòng)。除了會(huì)用CXF,Axis2等神級(jí)框架,其他的懶得動(dòng)了,都是Ctrl+V,Ctrl+C,把其他模塊的Request,Response貼過(guò)來(lái)。一旦增加某個(gè)特性,不得不在所有Request,Response遨游一遍。早知今日,何必當(dāng)初呢。
寫(xiě)一個(gè)好的Weservice Interface,關(guān)鍵是要多多總結(jié)。除了有Request,Response之外,還有很多。總結(jié)如下有:
Request:webservice的輸入。
Response:webservice輸出。
DataRsponse:帶結(jié)果集的webservice輸出。
ResultData:結(jié)果集,不同的interface,其ResultData不一樣。
ReslutInfo:描述調(diào)用請(qǐng)求成功或者失敗的對(duì)象。
WebServiceTemplate:模板類,定義如何調(diào)用下層函數(shù),如何處理異常錯(cuò)誤的流程
ResultDataCallback:回調(diào)類,與template配合,適用【返回結(jié)果集】操作,比如【獲取用戶信息】,【下訂單】
ResultCallback:回調(diào)類,與Template配置,適用于【不返回帶結(jié)果集的接口,比如【修改用戶名】
ResponseFactory:用來(lái)組裝 webservice消息 的工廠類。
ResultInfoFactory:用來(lái)處理異常信息的 工廠類,這個(gè)一個(gè)接口,為它實(shí)現(xiàn)一個(gè)默認(rèn)實(shí)例吧。
有了這些小弟們,任何webservice接口的定義都能輕易搞定,不信我舉個(gè)例子給你,咱們以【加法】為例!
AddRequest:
- public class AddRequest extends Request{
- private int add;
- private int added;
- public int getAdd() {
- return add;
- }
- public void setAdd(int add) {
- this.add = add;
- }
- public int getAdded() {
- return added;
- }
- public void setAdded(int added) {
- this.added = added;
- }
- }
AddResonse:
- public class AddResponse extends DataResponse<AddResultData>{
- private AddResultData resultData;
- public AddResultData getResultData() {
- return resultData;
- }
- public void setResultData(AddResultData resultData) {
- this.resultData = resultData;
- }
- }
AddResultData:
- public class AddResultData implements ResultData{
- private int sum;
- public AddResultData(int sum) {
- super();
- this.sum = sum;
- }
- public AddResultData() {
- super();
- }
- public int getSum() {
- return sum;
- }
- public void setSum(int sum) {
- this.sum = sum;
- }
- }
一個(gè)簡(jiǎn)單的webservice接口:
- public class Soap {
- public AddResponse add(final AddRequest request){
- return WebServiceTemplate.doResult(new ResultDataCallback<AddRequest,AddResponse,AddResultData>(){
- public AddResultData done() throws Exception {
- return new AddResultData(request.getAdd()+request.getAdded());
- }
- public AddResponse getRsp() {
- return new AddResponse();
- }
- });
- }
- }
一個(gè)簡(jiǎn)單的TestCase測(cè)試:
- public class TestSoap {
- @Test
- public void testAdd(){
- AddRequest add = new AddRequest();
- add.setAdd(1);
- add.setAdded(2);
- Soap soap = new Soap();
- AddResponse rsp =soap.add(add);
- assertEquals(3,rsp.getResultData().getSum());
- assertEquals("0",rsp.getResultInfo().getResultCode());
- assertEquals("success",rsp.getResultInfo().getResultDesc());
- }
- }
雖然這些很簡(jiǎn)單,但是能夠解決80%的問(wèn)題。剩下20%還要根據(jù)實(shí)際情況來(lái)定。況且,這些代碼在你的手中還有持續(xù)改優(yōu)化的空間。千萬(wàn)不要做一個(gè)愛(ài)Copy的孩子。
相關(guān)的代碼附件地址:【http://files.cnblogs.com/MartinChen999/webservice.rar】
新聞熱點(diǎn)
疑難解答
圖片精選