WebService SOAP、Restful和HTTP(post/get)請求區別

web service(SOAP)

Webservice的一個最基本的目的就是提供在各個不同平臺的不同應用系統的協同工作能力。?
Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。?
SOAP是一種簡單基于xml的輕量協議,用戶web上交換結構化信息和類型信息。?
soap請求是HTTP POST的一個專用版本,遵循一種特殊的xml消息格式Content-type設置為: text/xml任何數據都可以xml化。?
本文將通過一個簡單的示例講解和演示Android平臺的Web Service開發。

Ksoap2-android簡介

  在Android平臺調用Web Service需要依賴于第三方類庫ksoap2,它是一個SOAP Web service客戶端開發包,主要用于資源受限制的Java環境如Applets或J2ME應用程序(CLDC/ CDC/MIDP)。認真讀完對ksoap2的介紹你會發現并沒有提及它應用于Android平臺開發,沒錯,在Android平臺中我們并不會直接使用ksoap2,而是使用ksoap2 android。KSoap2 Android 是Android平臺上一個高效、輕量級的SOAP開發包,等同于Android平臺上的KSoap2的移植版本。需要引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
//WebService的命名空間static final String namespace = "http://impl.service.suncreate.com";   //服務器發布的url   static final String url = http://10.100.3.41/axis2/services/UploadService;   final String methodName = "upload"; // 函數名   final int sessionID = "111111"; //sessionID   //創建HttpTransportSE對象,通過HttpTransportSE類的構造方法可以指定WebService的url   HttpTransportSE transport = new HttpTransportSE(url);   transport.debug = true;   //指定WebService的命名空間和函數名   SoapObject soapObject = new SoapObject(namespace, methodName);   //設置調用方法參數的值   soapObject.addProperty("sessionID", sessionID); //sessionID   soapObject.addProperty("data", cds); //cds是需要傳遞的對象   SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);   envelope.bodyOut = transport;   envelope.setOutputSoapObject(soapObject);   //使用call方法調用WebService方法   transport.call(null, envelope);   SoapObject sb = (SoapObject) envelope.bodyIn;   String xmlMessage = sb.toString(); // 獲取從服務器端返回的XML字符串
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Restful

REST(Representational State Transfer)一種輕量級的Web Service架構,可以完全通過HTTP協議實現。其實現和操作比SOAP和XML-RPC更為簡潔,還可以利用緩存Cache來提高響應速度,性能、效率和易用性上都優于SOAP協議。?
REST架構對資源的操作包括獲取、創建、修改和刪除資源的操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法(Verb)

Restful與SOAP的區別

安全性:SOAP會好于restful?
效率和易用性(REST更勝一籌)?
成熟度(總的來說SOAP在成熟度上優于REST)

HTTP-GET 和 HTTP-POST?
HTTP-GET和HTTP-POST是標準協議,他們使用HTTP(超文本傳輸協議)謂詞(謂詞是指條件表達式的求值返回真或假的過程。)對參數進行編碼并將參數作為名稱/值對傳遞,還使用關聯的請求語義。每個協議都包含一系列HTTP請求標頭,HTTP請求標頭及其他一些信息定義客戶端向服務器請求哪些內容,哪個服務器用一系列HTTP響應標頭和所請求的數據進行響應。

HTTP-GET 使用 MIME 類型 application/x-www-form-urlencoded(將追加到處理請求的服務器的 URL 中)以 URL 編碼文本的形式傳遞其參數。 URL 編碼是一種字符編碼形式,可確保傳遞的參數中包含一致性文本,例如將空格編碼為 %20,其它符號轉換為%XX,其中XX為該符號以16進制表示的ASCII(或ISO Latin-1)值。 追加的參數也稱為查詢字符串。

與 HTTP-GET 類似,HTTP-POST 參數也是 URL 編碼的。 但是,名稱/值對是在實際的 HTTP 請求消息內部傳遞的,而不是作為 URL 的一部分進行傳遞。?
我們日常網站、系統都是使用這種形式進行訪問我們的應用程序。

package cn.roco.manage.service;import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; public class NewsService { public static final int POST = 1; public static final int GET = 2; public static final int HttpClientPost = 3; /** * 保存數據 * * @param title * 標題 * @param length * 時長 * @param flag * true則使用POST請求 false使用GET請求 * @return 是否保存成功 * @throws Exception */ public static boolean save(String path, String title, String timelength, int flag) throws Exception { Map<String, String> params = new HashMap<String, String>(); params.put("title", title); params.put("timelength", timelength); switch (flag) { case POST: return sendPOSTRequest(path, params, "UTF-8"); case GET: return sendGETRequest(path, params, "UTF-8"); case HttpClientPost: return sendHttpClientPOSTRequest(path, params, "UTF-8"); } return false; } /** * 通過HttpClient框架發送POST請求 * HttpClient該框架已經集成在android開發包中 * 個人認為此框架封裝了很多的工具類,性能比不上自己手寫的下面兩個方法 * 但是該方法可以提高程序員的開發速度,降低開發難度 * @param path * 請求路徑 * @param params * 請求參數 * @param encoding * 編碼 * @return 請求是否成功 * @throws Exception */ private static boolean sendHttpClientPOSTRequest(String path, Map<String, String> params, String encoding) throws Exception { List<NameValuePair> pairs = new ArrayList<NameValuePair>();// 存放請求參數 if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { //BasicNameValuePair實現了NameValuePair接口 pairs.add(new BasicNameValuePair(entry.getKey(), entry .getValue())); } } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, encoding); //pairs:請求參數 encoding:編碼方式 HttpPost httpPost = new HttpPost(path); //path:請求路徑 httpPost.setEntity(entity); DefaultHttpClient client = new DefaultHttpClient(); //相當于瀏覽器 HttpResponse response = client.execute(httpPost); //相當于執行POST請求 //取得狀態行中的狀態碼 if (response.getStatusLine().getStatusCode() == 200) { return true; } return false; } /** * 發送POST請求 * * @param path * 請求路徑 * @param params * 請求參數 * @param encoding * 編碼 * @return 請求是否成功 * @throws Exception */ private static boolean sendPOSTRequest(String path, Map<String, String> params, String encoding) throws Exception { StringBuilder data = new StringBuilder(); if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { data.append(entry.getKey()).append("="); data.append(URLEncoder.encode(entry.getValue(), encoding));// 編碼 data.append('&'); } data.deleteCharAt(data.length() - 1); } byte[] entity = data.toString().getBytes(); // 得到實體數據 HttpURLConnection connection = (HttpURLConnection) new URL(path) .openConnection(); connection.setConnectTimeout(5000); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Content-Length", String.valueOf(entity.length)); connection.setDoOutput(true);// 允許對外輸出數據 OutputStream outputStream = connection.getOutputStream(); outputStream.write(entity); if (connection.getResponseCode() == 200) { return true; } return false; } /** * 發送GET請求 * * @param path * 請求路徑 * @param params * 請求參數 * @param encoding * 編碼 * @return 請求是否成功 * @throws Exception */ private static boolean sendGETRequest(String path, Map<String, String> params, String encoding) throws Exception { StringBuilder url = new StringBuilder(path); url.append("?"); for (Map.Entry<String, String> entry : params.entrySet()) { url.append(entry.getKey()).append("="); url.append(URLEncoder.encode(entry.getValue(), encoding));// 編碼 url.append('&'); } url.deleteCharAt(url.length() - 1); HttpURLConnection connection = (HttpURLConnection) new URL( url.toString()).openConnection(); connection.setConnectTimeout(5000); connection.setRequestMethod("GET"); if (connection.getResponseCode() == 200) { return true; } return false; } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165

SOAP與HTTP的區別

大多數對外接口會實現web service方法而不是http方法。 c
web service相對http (post/get)的好處

1.接口中實現的方法和要求參數一目了然

2.不用擔心大小寫問題

3.不用擔心中文urlencode問題

4.代碼中不用多次聲明認證(賬號,密碼)參數

5.傳遞參數可以為數組,對象等…

6.web service相對http(post/get)由于要進行xml解析,速度可能會有所降低。

7.web service 完全可以可以被http(post/get)替代,而且現在的開放平臺都是用的HTTP(post/get)實現的。

轉載于:https://www.cnblogs.com/ruiati/p/6638394.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254962.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Block的循環引用詳解

1.首先我們創建了一個網絡請求工具類 然后storyboard里面去創建了一個導航控制器 并且把它設置為初始控制器 然后拖入一個bar button &#xff0d;&#xff0d;show&#xff0d;&#xff0d;到自帶的控制器 這個時候運行代碼的結果是 x 顯然這個時候沒有造成循環引用 為什…

HALCON示例程序measure_pump.hdev螺紋孔位置與尺寸測量

HALCON示例程序measure_pump.hdev螺紋孔位置與尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_var (‘off’) dev_update_off () read_image (Image, ‘pumpe’) get_image_size (Image, Width, Height) dev_close_window () dev_open_…

計算機視覺和圖形學中的攝像機內參數矩陣詳解

在計算機視覺和圖形學中都有“攝像機內參數矩陣”這個概念&#xff0c;其含義大致相同&#xff0c;但在實際使用過程中&#xff0c;這兩個矩陣卻相差甚遠。在增強現實中&#xff0c;為了使計算機繪制的虛擬物體和真實環境圖像對其&#xff0c;需要令虛擬攝像機的內參數和真實攝…

c#和html方法互調

具體見連接&#xff1a;https://www.cnblogs.com/zeroLove/p/3912460.html轉載于:https://www.cnblogs.com/gaara-zhang/p/8746403.html

數據庫基礎雜記

sql,Structured Query Language結構化查詢語言。SQL 是一門 ANSI(美國國家標準局) 的標準計算機語言&#xff0c;用來訪問和操作數據庫系統。SQL 語句用于取回和更新數據庫中的數據。SQL 可與數據庫程序協同工作&#xff0c;比如 MS Access、DB2、Informix、MS SQL Server、Ora…

很有用的X264和ffmpeg的設置

很有用的X264和FFMPEG的設置 http://www.360doc.com/content/11/0209/16/3705984_91612512.shtml 點擊打開鏈接

HALCON示例程序measure_ring.hdev齒輪齒寬度測量

HALCON示例程序measure_ring.hdev齒輪齒寬度測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 read_image (Image, ‘rings_and_nuts’) dev_close_window () dev_open_window_fit_image (Image, 0, 0, 640, 640, WindowHandle) set_display_font (Windo…

基于RBGD的mapping

最近學習RGBD的SLAM&#xff0c;收集了兩個RGBD的mapping的開源工具包 1.RGBDSlam2 a.安裝方法&#xff1a; #準備工作空間 source /opt/ros/indigo/setup.bash mkdir -p ~/rgbdslam_catkin_ws/src cd ~/rgbdslam_catkin_ws/src catkin_init_workspace cd ~/rgbdslam_catkin_ws…

【瓜分5000元獎金】Wannafly挑戰賽13

鏈接&#xff1a;https://www.nowcoder.com/acm/contest/80/A來源&#xff1a;牛客網 zzy的小號 時間限制&#xff1a;C/C 1秒&#xff0c;其他語言2秒空間限制&#xff1a;C/C 262144K&#xff0c;其他語言524288K64bit IO Format: %lld題目描述 學家zzy根據字體的特點&#…

X264參數設定詳細解釋

x264 core:65 r1074M b6bb3d4 Syntax: x264 [options] -o outfile infile [widthxheight] 語法(命令行寫法)&#xff1a;x264 [參數] -o 輸出文件名 輸入文件名 [寬x高] 范例&#xff1a; x264 --crf 26 --ref 3 --mixed-refs --bframes 3 --b-adapt 2 --b-pyramid --weightb -…

20145217《網絡對抗》 惡意代碼分析

20145217《網絡對抗》 免殺原理與實踐 知識點學習總結 進行惡意代碼分析之前必須具備以下知識&#xff1a;編程、匯編/反匯編、網絡基本知識、PE文件結構以及一些常用行為分析軟件。 一、在一個已經感染了惡意代碼的機器上如何找到病毒文件&#xff1f; 找到惡意代碼才能對其分…

HALCON示例程序measure_screw.hdev螺紋尺寸測量

HALCON示例程序measure_screw.hdev螺紋尺寸測量 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () read_image (Image, ‘screw_thread’) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_close_window () dev_open_window…

邊工作邊刷題:70天一遍leetcode: day 97-2

Design Hit Counter 要點&#xff1a;因為是second granularity&#xff0c;所以可以用以秒為單位的circular buffer方法。這題簡單在只需要count過去300秒的&#xff0c;增加難度可以count過去秒&#xff0c;分鐘&#xff0c;小時。 2個時間點都有可能更新超時的統計&#xff…

cvRemap 對圖像進行普通幾何變換

cvRemap 對圖像進行普通幾何變換 函數 cvRemap 利用下面指定的矩陣變換輸入圖像:   dst(x,y)<-src(mapx(x,y),mapy(x,y))   與其它幾何變換類似&#xff0c;可以使用一些插值方法&#xff08;由用戶指定&#xff0c;同cvResize&#xff09;來計算非整數坐標的像素值 vo…

disconf(二):服務端使用總結

1、服務端原理客戶端啟動&#xff0c;把配置文件&#xff0c;配置項存到倉庫&#xff0c;等到服務端啟動&#xff0c;從服務端拉取數據&#xff1b;服務端更新&#xff0c;則通過zk通知客戶端&#xff0c;客戶端知道更新后&#xff0c;會從服務端拉取最新的配置文件&#xff0c…

B2C和B2B之間有多大差距

從產品應用的角度&#xff0c;我們團隊經歷了企圖將B2C系統套用到B2B業務流程上的階段&#xff0c;對于自營業務這還勉強可以實施&#xff0c;但對于外部用戶的實施難度就太大了&#xff0c;用戶體驗也不好。這個過程中&#xff0c;我只關注了技術范疇的迭代速度、而忽略了用戶…

h.264 視頻解碼的一點小經驗(ffmpeg)

最近做視頻文件264解碼&#xff0c;由于對這個領域不是很熟悉&#xff0c;感覺困難重重。不過經過不懈的努力&#xff0c;已經取得一些進展&#xff0c;心里感覺特別慶幸。 剛開始做這個的時候&#xff0c;由于不熟悉&#xff0c;就在網上搜尋資料&#xff0c;網絡上的資料雖然…

HALCON示例程序novelty_detection_dyn_threshold.hdev紗網缺陷檢測

HALCON示例程序novelty_detection_dyn_threshold.hdev紗網缺陷檢測 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’) read_image (Image, ‘plastic_mesh/plastic_mesh_01’) dev_close_window () get_image_size (Image, Width…

配置云服務器 FTP 服務

自己配置的環境: OS: 阿里云 CentOS 6.5 >>Begin: 1. 登錄到阿里云服務器(如何登錄阿里云服務器), 在root權限下, 通過如下命令安裝 vsftp [rootVM_250_202_tlinux ~]# yum install vsftpd 2. 在啟動vsftpd服務之前&#xff0c;需要登錄云服務器修改配置文件&#xff0c;…

【躍遷之路】【428天】程序員高效學習方法論探索系列(實驗階段185-2018.04.09)...

(躍遷之路)專欄 實驗說明 從2017.10.6起&#xff0c;開啟這個系列&#xff0c;目標只有一個&#xff1a;探索新的學習方法&#xff0c;實現躍遷式成長實驗期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我將以自己為實驗對象。我將開源我的學習方法&#xff0c;方法不斷…