1. 程式人生 > >Java使用SOAP獲取webservice例項解析

Java使用SOAP獲取webservice例項解析

這篇文章是根據一位cnblogs上的一位大大,做了些修改而已

他的文章:走嘍~~

進入正文,為了怕資源丟失,我選擇了全部黏貼複製了一遍!

以下是 SOAP 1.1 請求和響應示例。所顯示的佔位符需替換為實際值。

[http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?op=qqCheckOnline] 點選前面的網址,檢視對應引數資訊。

3、Java程式碼

package com.jyxp.soap;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;

public class SoapQQTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			(new SoapQQTest()).sendSms();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
	private void sendSms() throws Exception {
		String qqCode = "55555";
		String urlString = "http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx";
		String xml = SoapQQTest.class.getClassLoader().getResource("SendInstantSms.xml").getFile();
		String xmlFile = replace(xml, "qqCodeTmp", qqCode).getPath();
        String soapActionString = "http://WebXml.com.cn/qqCheckOnline";
        URL url = new URL(urlString);
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        File fileToSend = new File(xmlFile);
        byte[] buf = new byte[(int) fileToSend.length()];
        new FileInputStream(xmlFile).read(buf);
        httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length));
        httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
        httpConn.setRequestProperty("soapActionString", soapActionString);
        httpConn.setRequestMethod("POST");
        httpConn.setDoOutput(true);
        httpConn.setDoInput(true);
        OutputStream out = httpConn.getOutputStream();
        out.write(buf);
        out.close();

        byte[] datas = readInputStream(httpConn.getInputStream());
        String result=new String(datas);
        //列印返回結果
        System.out.println("result:" + result);
	}
	
	/**
     * 檔案內容替換
     * 
     * @param inFileName 原始檔
     * @param from
     * @param to
     * @return 返回替換後文件
     * @throws IOException
     * @throws UnsupportedEncodingException
     */
    public static File replace(String inFileName, String from, String to)
            throws IOException, UnsupportedEncodingException {
        File inFile = new File(inFileName);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream(inFile), "utf-8"));
        File outFile = new File(inFile + ".tmp");
        PrintWriter out = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")));
        String reading;
        while ((reading = in.readLine()) != null) {
            out.println(reading.replaceAll(from, to));
        }
        out.close();
        in.close();
        //infile.delete(); //刪除原始檔
        //outfile.renameTo(infile); //對臨時檔案重新命名
        return outFile;
    }
    
    /**
     * 從輸入流中讀取資料
     * @param inStream
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while( (len = inStream.read(buffer)) !=-1 ){
            outStream.write(buffer, 0, len);
        }
        byte[] data = outStream.toByteArray();//網頁的二進位制資料
        outStream.close();
        inStream.close();
        return data;
    }
}
4、SendInstantSms.xml檔案如下,放在src目錄下
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <qqCheckOnline xmlns="http://WebXml.com.cn/">
      <qqCode>qqCodeTmp</qqCode>
    </qqCheckOnline>
  </soap:Body>
</soap:Envelope>

5、然後自己測試,得到的資料如下
result:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><qqCheckOnlineResponse xmlns="http://WebXml.com.cn/"><qqCheckOnlineResult>N
</qqCheckOnlineResult></qqCheckOnlineResponse></soap:Body></soap:Envelope>
如上,黃色背景的N,我們根據QQ返回的資料【返回資料:String,Y = 線上;N = 離線;E = QQ號碼錯誤;A = 商業使用者驗證失敗;V = 免費使用者超過數量】就表示不線上,呵呵……

以上是從那位大大的部落格轉的,

下面是自己的完善。

1、先向大家推薦個好工具,應該不少人都知道了,就是Fiddler,這是一款資料追蹤工具,

配置:Tools >Fiddler Options > Connections >把Fiddler listens on port:改為下面你要設定的埠(下面我設定的8888) >並且把Allow remote computers to connect 勾選上。

2、如果資料反饋不回來的話,我們可以用它設定下代理,找到返回的資料,

(1、)把上面Java程式碼中的

HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
改為如下
Proxy proxy = new Proxy(Proxy.Type.DIRECT.HTTP, new InetSocketAddress("127.0.0.1", 8888));        
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(proxy);
就可以抓取到返回的詳細資料。[注:在沒有開啟Fiddler的情況下,就把代理去掉,換成之前的!!否則會報錯的]

3、如果傳遞多個引數值的話,我們再用上面的replace()方法,最終得到的結果是值替換了最後一個,下面共享下,一次替換多個字元的程式碼。有人可能直接在SendInstantSms.xml檔案中把值改成引數,這樣是可以的,但是不利於安全呢,所以我們用臨時檔案,然後再刪除掉。

public static File replace(String inFileName, String[] from, String[] to)
            throws IOException, UnsupportedEncodingException {
        File inFile = new File(inFileName);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream(inFile), "utf-8"));
        File outFile = new File(inFile + ".tmp");
        PrintWriter out = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")));
        String reading;
        StringBuffer sb = new StringBuffer();
        while ((reading = in.readLine()) != null) {
            sb.append(reading + "\n");
        }
        String newString = sb.toString();
        for (int i = 0; i < from.length; i++) {
			newString = newString.replaceAll(from[i], to[i]);
		}
        out.println(newString);
        
        out.close();
        in.close();
        return outFile;
    }

4、還有宣告下,在參考的部落格中,他說分析的是Soap1.2的,那是錯誤的,如下才是Soap1.2的格式,相信大家一眼就看出區別了!
POST /webservices/qqOnlineWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <qqCheckOnline xmlns="http://WebXml.com.cn/">
      <qqCode>string</qqCode>
    </qqCheckOnline>
  </soap12:Body>
</soap12:Envelope>


相關推薦

C#使用SOAP獲取webservice例項解析

程式碼如下: using System.IO; using System.Xml; using System.Net; namespace ConsoleApplicationTest2 { class SOAPTest {

Java使用SOAP獲取webservice例項解析

這篇文章是根據一位cnblogs上的一位大大,做了些修改而已 他的文章:走嘍~~ 進入正文,為了怕資源丟失,我選擇了全部黏貼複製了一遍! 以下是 SOAP 1.1 請求和響應示例。所顯示的佔位符需替換為實際值。 [http://www.webxml.com.cn/we

Xml WebService完全例項解析(四)

最近時間太少了,馬上要走了,這篇文章就算是結尾吧,可能說明會少些,程式碼多些.      接上篇文章,我們先簡單說明下繫結函式.首先例項化ServiceA,這個和一般類的例項化並沒有不同..接下來用xmlNode1來接受函式的返回值,接下來是構造xml,並將其轉化為data

獲取WebService的請求信息

abcd lob stream close execution request 技術 form nta 一個已經寫好的項目中有多個WebService,由於之前沒有記錄請求信息的,有時候需要查錯等需要找到當次的請求信息,所以需要加入記錄請求信息的功能。 首先想到的是在每一個

spring 官方文件的介面理解整理(四)型別轉換spring例項解析

上篇文章解析了spring型別轉換的介面和他們的分工,怎麼通過設計模式實現轉換功能。 這篇需要些上篇的知識,如果沒有看可以從這兒跳轉spring 官方文件的介面理解整理(三)型別轉換 一、準備新建Maven專案,pom.xml內容如下 <properties>

android ANR、traces檔案獲取例項分析

前言:前段時間專案開發中遇到anr的問題,時間緊急,一時間又難以定位,通過臨時方法解決後,最近有時間對ANR的問題做一次份細的解決方案,本文中的解決方案是通過綜合其他部落格後自己再通過例項驗證後得出的可行方案,讀者如遇類似問題可做參考,歡迎評論交流。

通俗理解卡爾曼濾波及其演算法實現(帶例項解析

1.簡介(Brief Introduction) 在學習卡爾曼濾波器之前,首先看看為什麼叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現代人! 卡爾曼全名Rudolf Emil Kalman,匈牙利數學家,1930年出生於

控制檯實現js發起http請求 —— AJAX 例項解析

此處以一個簡單的測試使用者登入介面為例。。。 如果一個網站的登入模組設計的很簡單的話,可以通過不斷髮起請求去測試一個賬號的密碼。。。 // 第一步:建立 XMLHttpRequest 物件 var xmlhttp; if (window.XMLHttpRequest) {// code

C#最簡單最完整的webservice例項

一、環境      我的開發環境是xp的sp3,這個對於asp.net的要求是v2.0.50727 如果不是的話會報錯,可以到本地的 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -

activiti開發筆記-----根據流程例項id獲取例項的發起人等資訊

1.根據例項取得該例項資訊的個例 HistoricProcessInstance processInstance= ProcessEngines.getDefaultProcessEngine(). getHistoryService().createHistoricProcessInstanc

模擬使用者登入(獲取cookie/例項化session)

第一種方法:通過本地瀏覽器儲存的cookie進行登陸 url1 = 'https://passport.cnblogs.com/user/signin?ReturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F' url2 = 'https://www.cnblogs.

c++ coredump例項解析

一、背景     經過重重除錯後,看到編譯成功的那一刻,內心充滿歡喜。當程式一執行,卻經常出現coredump的情況,此時內心是崩潰的。我想程式設計師經常會碰到這種情況,尤其使用c++語言編寫程式碼,由於沒有自動記憶體管理,經常會出現coredump情況,主要原因有以下幾

影象修復例項解析(三)

本篇基於SIGGRAPH 2017 (ACM ToG)的 Globally and Locally Consistent Image Completion  (CE中加入Global+Local兩個判別器的改進),  proj:http://hi.cs.waseda.ac

webservice學習筆記(十二):js與jquery利用ajax獲取webservice返回值

1.webservice服務端程式碼如圖(ps:只是一個簡單的sayHello的demo):   -服務端是基於spring的,具體beans.xml配置如下: <?xml version="1.0" encoding="UTF-8"?> <bea

java HttpClient 訪問webservice解析返回資料

關於webservice的普及就不多說了,直接進入主題吧。 1.導包 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient HttpClient相關包-->

抽象類和介面的異同及例項解析

與具體類比較 抽象類不能直接例項化,並且對抽象類使用 new 運算子會導致 編譯時錯誤。雖然一些變數和值在編譯時的 型別可以是抽象的,但是這樣的變數和值必須或者為 null,或者含有對非抽象類的例項的 引用(此非抽象類是從抽象類派生的)。

FC 7.3.2 執行時許可權及其獲取通訊錄例項

定義 24種執行時許可權 獲取通訊錄例項   執行時許可權(Dangerous Permissions) 在保護使用者隱私方面:Android6.0為了更好的保護個人隱私,添加了執行時許可權: 分為兩類,一類是Normal Permissions

TSM檔案格式及例項解析(四)——string的排列

目錄 引: 資料 簡析 Indexes: blocks: 關聯string 小結: TSM檔案格式現已基本明瞭,某些壓縮演算法有空再去研究一下。 引: 現在想知道未壓縮的檔案格式是怎樣。 但是翻遍官方配置文件 https://docs.influx

調用webservice解析xml屬性值

stack null mls als cep ext XML per exc 1、調用webservice try { String endpoint = "http://22.222.22.22:280/iss-ws/services/SyncU

使用webService例項

1、先來介紹一下什麼是web service Web service是一個平臺獨立的,低耦合的,自包含的、基於可程式設計的web的應用程式,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、釋出、發現、協調和配置這些應用程式,用於開發分散式的互操作