Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> WebService理解和代碼解析

WebService理解和代碼解析

編輯:關於Android編程

/** WebServcie 概念  

多個系統數據交換: 跨平台語言的相互通信;
	如:java 的客戶端 和dotnet的服務器端的接口調用:
		得到接口和方法	: 基於標准的協議,可編程語言;  服務器開發 api;
	
	特點:
		自包含:只要客戶端支持http和xml就可以;
		自描述:只需要知道請求響應的類型;  其他的不需要考慮
		跨平台:不同語言可以相互通信。
		通過網絡:發布查找使用;
		松耦合;
	
	術語:
		XML:擴展型可標記語言;
		SOAP:簡單對象訪問協議;用來描述傳遞信息的格式;  xml方法的調用規范;支持http等協議
		WSDL:web描述性語言,xml文檔,自動生成;;  說明一組soap消息,和如何交互消息,是軟件自動生成的xml文檔;
		UDDI:英文為 "Universal Description, Discovery and Integration"通用描述、發現與集成服務;  引導系統查找響應服務的機制;
			 根據描述文檔,來引導系統查找響應服務的機制。  提供自出服務,其他廠商根據服務;
			 
			 
		【公司的舉例:】		
			soap 協議、合同,約束雙方   
			wsdl  說明書,提供什麼服務    
			uddi 工商注冊,方便別人查詢

		

*/

/* wsdl  
	wsdl 文檔包含
	
		詳細學習:http://www.w3school.com.cn/wsdl/wsdl_documents.asp
		
		某種類型系統:
		
		WSDL 文檔是利用這些主要的元素來描述某個 web service 	
		
		元素 		定義
			 web service 執行的操作
		 	web service 使用的消息
		 	web service 使用的數據類型
		 	web service 使用的通信協議

		
		
*/

/* soap  
	簡單對象的訪問協議;
		基於xml協議,以xml形式提供了一個簡單的數據交換的協議;
		訪問web服務的簡單對象的訪問協議
		通過http實現信息傳遞
		1)soap封裝:描述消息中的內容;
		2)soap編碼規則:定義序列化的機制、應用程序類型實例;
		3)soap rpc : 遠程應答的協議  遠程過程調用
		4)soap綁定: 節點間交互 soap的封裝
	
	格式如:
POST /webservices/EnglishChinese.asmx HTTP/1.1
Host: fy.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/Translator"



  
    
      string
    
  
	

	規則:
		需要使用xml編碼
		是必須的
		Type傳輸數據類型
		soap:Envelope 必須使用命名空間

	優點:1)可擴展;2)簡單的;3)和廠商無關;4)編程語言無關;

*/

//***********【soap1.1 解析的過程】**************
/**
	soap 1.1  xmlpull  conn  URL   
	
	1.代碼和注解
	2.xml文件
	
*/

/**  2016年9月  整理webService的解析  (單詞以外的鏈接有問題)
	 * WebService POST 請求 Soap1.1協議、 xml解析
	 * 
	 * @see 單詞翻譯查詢網址:
	 * @see 1.網址:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
	 * @see 2.選方法: Translator 查詢單詞
	 * @see 3.方法中看soap協議,1.1或者1.2。對應post 中,xml部分復制,在asset中建立xml文件保存。
	 * @see 4.修改xml中 ,參數部分,如:string 。其中string修改為
	 *      #word,方便後續代碼替換
	 * @see 步驟
	 * @see 1、xml參數轉 流,替換單詞參數, 並創建HttpURLConnection鏈接
	 * @see 2、conn設置鏈接的 協議,參考 soap文件 conn.setRequestProperty("Content-Type",
	 *      "text/xml; charset=utf-8"); Content-Type Content-Length SOAPAction
	 * @see 3、os 輸出流 寫 刷新
	 * @see 4、輸入流 並 xml解析
	 * 
	 * 
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public void WspostSoap11() throws IOException, XmlPullParserException {

		/*
		 * ( 1.inputstream 2.url 3.outputstaam 4.inputsteeem 5.xmlpull
		 */

		String path = "word.xml";

		InputStream is = getAssets().open(path);// MainActivity.class.getClassLoader().getResourceAsStream(path);
		InputStreamReader reader = new InputStreamReader(is, "utf-8");
		BufferedReader bfReader = new BufferedReader(reader);
		String str = "";
		StringBuilder sb = new StringBuilder();
		while ((str = bfReader.readLine()) != null) {
			// str += str.replace("#word", "girl");
			sb.append(str.replace("#word", "girl"));
		}
		byte[] data = sb.toString().getBytes();

		String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
		URL urls = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
		conn.setRequestMethod("POST");
		conn.setConnectTimeout(5 * 1000);
		conn.setReadTimeout(3 * 1000);
		conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
		conn.setRequestProperty("Content-Length", data.length + "");
		conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/Translator");
		conn.setDoOutput(true);

		OutputStream os = conn.getOutputStream();
		os.write(data, 0, data.length);

		os.flush();

		InputStream isRusult = conn.getInputStream();

		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = factory.newPullParser();

		parser.setInput(isRusult, "utf-8");

		String result = "";
		while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
			if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("Translation")) {
				result = parser.nextText();
			}
			if ("Trans".equals(parser.getName())) {
				Log.e(TAG, " Trans  " + parser.toString());
			}
			parser.next();

		}

		Log.e(TAG, " result  " + result);

	}
//=====================word.xml


  
    
      #word
    
  


//=====================參考的 SOAP 1.1
POST /webservices/EnglishChinese.asmx HTTP/1.1
Host: fy.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/Translator"



  
    
      string
    
  

//***********【soap1.2 解析的過程】**************
/**
	 * WebService POST 請求 Soap1.2協議、 xml解析
	 * 
	 * @see 單詞翻譯查詢網址:
	 * @see 1.網址:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
	 * @see 2.選方法: Translator 查詢單詞
	 * @see 3.方法中看soap協議,1.1或者1.2。對應post 中,xml部分復制,在asset中建立xml文件保存。
	 * @see 4.修改xml中 ,參數部分,如:string 。其中string修改為
	 *      #word,方便後續代碼替換
	 * @see 步驟
	 * @see 1、xml參數轉 流,替換單詞參數, 並創建HttpURLConnection鏈接
	 * @see 2、conn設置鏈接的 協議,參考 soap文件 conn.setRequestProperty("Content-Type",
	 *      "text/xml; charset=utf-8"); Content-Type Content-Length SOAPAction
	 * @see 3、os 輸出流 寫 刷新
	 * @see 4、輸入流 並 xml解析
	 * 
	 * @category soap 1.1 與  1.2 不同地方兩個:
	 * 			1、setRequestProperty   1.2 設置協議中沒有 SOAPAction
	 * 			2、1.2 協議的 xml文件不太一樣。
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public void WspostSoap12() throws IOException, XmlPullParserException {

		/*
		 * ( 1.inputstream 2.url 3.outputstaam 4.inputsteeem 5.xmlpull
		 */

		String path = "word12.xml";

		InputStream is = getAssets().open(path);// MainActivity.class.getClassLoader().getResourceAsStream(path);
		InputStreamReader reader = new InputStreamReader(is, "utf-8");
		BufferedReader bfReader = new BufferedReader(reader);
		String str = "";
		StringBuilder sb = new StringBuilder();
		while ((str = bfReader.readLine()) != null) {
			sb.append(str.replace("#word", "boy"));
		}
		byte[] data = sb.toString().getBytes();

		String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
		URL urls = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
		conn.setRequestMethod("POST");
		conn.setConnectTimeout(5 * 1000);
		conn.setReadTimeout(3 * 1000);
		conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
		conn.setRequestProperty("Content-Length", data.length + "");
//		conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/Translator");
		conn.setDoOutput(true);

		OutputStream os = conn.getOutputStream();
		os.write(data, 0, data.length);

		os.flush();

		InputStream isRusult = conn.getInputStream();

		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = factory.newPullParser();

		parser.setInput(isRusult, "utf-8");

		String result = "";
		while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
			if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("Translation")) {
				result = parser.nextText();
			}
			if ("Trans".equals(parser.getName())) {
				Log.e(TAG, " Trans  " + parser.getName());
			}
			parser.next();
		}
		Log.e(TAG, " result  " + result);
	}

//**********【使用jar包的解析方法soap】**********************
	/**
	 * soap 解析
	 * 
	 * @see 1.導包 ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
	 * @see 2.定義網址、方法、命名空間
	 * @see 3.HttpTransportSE soap請求對象
	 * @see 4.SoapSerializationEnvelope soap序列化後的封裝對象: soap信封
	 * @see 5.SoapObject 參數對象 並設置 addProperty
	 * @see 6.htse 調用 call方法 client.call(namespace + method, envelope);
	 * @see 7.信封中  查看響應 envelope.getResponse,返回bodyIn信息:字符串替換查找
	 * 
	 */
	public void soapDictionaryWord() {
		try {
			// 要訪問的網址
			String wsdl = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
			// webservice 的功能名稱
			String method = "Translator";
			// 響應數據的namespace
			String namespace = "http://WebXml.com.cn/";

			// soap客戶端 http傳輸協議對象 send envelope
			HttpTransportSE client = new HttpTransportSE(wsdl);
			// soap序列化後的封裝對象: soap信封
			SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			// 參數對象 目標
			SoapObject params = new SoapObject(namespace, method);

			// 添加要翻譯的單詞 添加屬性
			params.addProperty("wordKey", "Everybody");
			// 設置參數對象 放入信封
			envelope.bodyOut = params;
			// 設置支持dotNet 服務器
			envelope.dotNet = true;

			// 訪問webService 1.設置所需的SOAPAction頭字段 2.包含soap調用信息的信封
			client.call(namespace + method, envelope);
			// 有響應結果 ; api 從包裝對象中拉取一個對象,並返回,不為空表示得到了對象
			if (envelope.getResponse() != null) {
				// 返回響應對象 接收信封中的內容
				SoapObject response = (SoapObject) envelope.bodyIn;
				// 處理響應數據 : 返回指定位置的特定屬性 0;得到body中的內容
				SoapObject obj = (SoapObject) response.getProperty(0);

				System.out.println("------" + obj);
				// 獲取響應的字符串
				String result = obj.toString();
				// 找截斷的起始位置
				int firstIndex = result.indexOf("Translation=");
				// 找截斷的終止位置
				int endIndex = result.indexOf(";", firstIndex);
				// 翻譯後的字符串
				String transWord = result.substring(firstIndex + "Translation=".length(), endIndex);

				System.out.println("------" + transWord);
				System.out.println("------" + getResult(result, "Trans=別", "。"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//測試解析字符串的方法
	public String getResult(String resu, String starStr, String endStr) {
		int first = resu.indexOf(starStr);
		int end = resu.indexOf("。", first);
		return resu.substring(first + starStr.length() - 1, end);
	}

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved