學習記錄(webservice)

來源:互聯網
上載者:User

標籤:app   利用   rpc   NPU   輕量級   +=   ted   font   term   

WebService 的發布與調用

 

發布:https://wenku.baidu.com/view/2edb9cff941ea76e58fa042c.html

JAVA調用Webservice

RPC 方式,強烈推薦。這種方式不多說,直接看代碼就懂了

  1. public String getOnline(String url){
  2. int errCode=0;
  3. JSONObject resultJson=new JSONObject();
  4. String result="";
  5. Service service = new Service();
  6. Call call;
  7. try {
  8. call=(Call) service.createCall();
  9. QName opAddEntry = new QName("urn:demo", "GetOnlineInfo"); //設定命名空間和需要調用的方法名
  10. call.setTargetEndpointAddress(url); //佈建要求路徑
  11. call.setOperationName("GetNcgOnlineInfo"); //調用的方法名
  12. call.setTimeout(Integer.valueOf(2000));//佈建要求逾時
  13. call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設定傳回型別
  14. result= (String) call.invoke(opAddEntry,new Object[]{});
  15.  
  16. } catch (ServiceException e) {
  17. // TODO Auto-generated catch block
  18. System.out.println("查詢線上狀態1:"+e.getMessage());
  19. errCode=1;
  20. } catch (RemoteException e) {
  21. // TODO Auto-generated catch block
  22.                         System.out.println("查詢線上狀態2:"+e.getMessage());
  23. errCode=2;
  24. }
  25. resultJson.put("errCode", errCode);
  26. resultJson.put("data", result);
  27.  
  28. return resultJson.toString();
  29. }

裡面注釋比較全。還有些別的設定也比較簡單,自己琢磨就知道了。例如編碼方式、解析時間等。

      說說這種方式的問題吧。我在使用的時候遇到的是:和我對接的人編寫了兩個WebService。但是由於這兩個中有許多部分是相同的,他就把這兩個合并了,同時提供了兩個命名空間(具體怎麼操作的我也不清楚),那麼問題了,這其中有一個命名空間的所有方法我都能成功調用,但是都無法收到傳回值。當時我就方了,開始還是好好的,怎麼就突然不行了,於是我繼續執行,查看報錯訊息,同時抓包查看報文內容。終於給我發現了問題。

是返回結果報的錯,大體意識就是說我設定的命名空間和對方的命名空間不匹配。然後RPC解析就失敗了。

        然後我利用Wireshark抓包,得到一下結果。可以看看出,我請求的是命名空間是 ns1="urn:ncg"(其餘的都是wsdl預設內建的)。可是我收到的返回報文就變了。變成了這樣的  xmlns:dag="http://tempuri.org/dag.xsd" xmlns:dag="urn:dag" xmlns:ncg="urn:ncg"  足足有三個啊。RPC按照預設設定的 ns1="urn:ncg" 去解析,那肯定什麼都解析不了的。所以只有自己去解析了。這種情況可以利用第三種或者第四種方式進行調用。

    第三種:利用HttpURLConnection拼接和解析報文進行調用。

    還是上面那個查詢裝置的方法。只不過改了下。當然,我這是知道報文後的解決辦法。

  1. public String ncgConnection(String url,String method){
  2. URL wsUrl;
  3. int errCode=0;
  4. JSONObject resultJson=new JSONObject();
  5. String result="";
  6. try {
  7. wsUrl = new URL(url+"/"+method);
  8. HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection();
  9.  
  10. conn.setDoInput(true);
  11. conn.setDoOutput(true);
  12. conn.setRequestMethod("POST");
  13. conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
  14. conn.setConnectTimeout(2000);
  15. conn.setReadTimeout(2000);
  16. OutputStream os = conn.getOutputStream();
  17. //請求體
  18.  
  19. //<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:DeleteCascadeFromCms soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:ncg"><ncg-code-list xsi:type="xsd:string">["11241525"]</ncg-code-list></ns1:DeleteCascadeFromCms></soapenv:Body></soapenv:Envelope>
  20.  
  21. String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
  22. + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><ns1:"+method+" soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:ns1=\"urn:ncg\"/></soapenv:Body></soapenv:Envelope>";
  23. os.write(soap.getBytes());
  24. InputStream is = conn.getInputStream();
  25.  
  26. byte[] b = new byte[1024];
  27. int len = 0;
  28. String s = "";
  29. while((len = is.read(b)) != -1){
  30. String ss = new String(b,0,len,"UTF-8");
  31. s += ss;
  32. }
  33.                                  result=s.split("<response xsi:type=\"xsd:string\">")[1].split("</response>")[0];
  34.  
  35. is.close();
  36. os.close();
  37. conn.disconnect();
  38. } catch (MalformedURLException e) {
  39. // TODO Auto-generated catch block
  40. System.out.println("通訊模組1:"+e.getMessage());
  41. errCode=1;
  42. } catch (IOException e) {
  43. // TODO Auto-generated catch block
  44. System.out.println("通訊模組2:"+e.getMessage());
  45. errCode=2;
  46. }
  47. resultJson.put("errCode", errCode);
  48. resultJson.put("data", result);
  49.  
  50. return resultJson.toString();
  51. }

    正常來說,利用HttpURLConnection實現很多的調用不需要自己拼接要求標頭和解析返回結果的(例如java端提供的一些action或者controller),可是在這兒調用WebService,確確實實的需要自己手寫。對比上面那個Wireshark抓包的結果可以發現,在請求體部分按照對方提供的wsdl進行拼接,結果部分也進行相同的解析。可以正確獲得結果。

第四種,利用httpclient

    簡單來說,httpClient可以算是加強版的HttpURLConnection,httpClient的API比較多,也比較穩定,不容易擴充。HttpURLConnection比較輕量級,容易根據自己的需求進行擴充。但是穩定性不如httpClient。

     這種方法具體實現思路和HttpURLConnection一樣。只是有點小區別。代碼如下:

  1. public void demo(String url){
  2.  
  3. HttpClient httpClient=new HttpClient();
  4. PostMethod postMethod=new PostMethod();
  5. postMethod.setPath(url+"/ncg.wsdl"); //路徑和wsdl名
  6.  
  7. String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
  8. + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><ns1:GetNcgOnlineInfo soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:ns1=\"urn:ncg\"/></soapenv:Body></soapenv:Envelope>";
  9.  
  10. try {
  11. byte[] b=soap.getBytes("utf-8");
  12.  
  13. InputStream is = new ByteArrayInputStream(b, 0, b.length);
  14. RequestEntity re = new InputStreamRequestEntity(is, b.length,
  15. "application/soap+xml; charset=utf-8");
  16. postMethod.setRequestEntity(re);
  17. int statusCode = httpClient.executeMethod(postMethod);
  18.  
  19. String soapResponseData = postMethod.getResponseBodyAsString();
  20.  
  21. postMethod.releaseConnection();
  22.                         //解析
  23.                         System.out.println(soapResponseData.split("<response xsi:type=\"xsd:string\">")[1].split("</response>")[0]);
  24. } catch (UnsupportedEncodingException e1) {
  25. // TODO Auto-generated catch block
  26. e1.printStackTrace();
  27. } catch (HttpException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. } catch (IOException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34.  
  35. }

      結果:我這兒沒有做更多的判斷,直接輸出,這種方式我以前其實並沒有用到。如果有需要可以更具返回的狀態判斷是否成功。如果你去抓包的話,你會發現這個會和上面HttpURLConnection抓的一樣。

    

轉載至  79522746

僅供個人學習參考

學習記錄(webservice)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.