Get和Post同步請求的時候最常見的是登入,輸入各種密碼才能看到的功能,必須是同步,異步在Web上局部重新整理的時候用的比較多,比較耗時的時候執行異步請求,可以讓客戶先看到一部分功能,然後慢慢重新整理,舉個例子就是餐館吃飯的時候點了十幾個菜,給你先上一兩個吃着,之後給别人上,剩下的慢慢上。大概就是這樣的。弄了幾個按鈕先上圖:
先貼下同步請求的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<code>//設定URL路徑</code>
<code> </code><code>NSString</code> <code>*urlStr=[</code><code>NSString</code> <code>stringWithFormat:@</code><code>"http://localhost:8080/MyWeb/Book?username=%@&password=%@&type=get"</code><code>,@</code><code>"部落格園"</code><code>,@</code><code>"keso"</code><code>];</code>
<code> </code><code>urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
<code> </code><code>NSURL</code> <code>*url=[</code><code>NSURL</code> <code>URLWithString:urlStr];</code>
<code>//通過URL設定網絡請求</code>
<code>NSURLRequest</code> <code>*request = [[</code><code>NSURLRequest</code> <code>alloc]initWithURL:url cachePolicy:</code><code>NSURLRequestUseProtocolCachePolicy</code> <code>timeoutInterval:10];</code>
<code>NSError</code> <code>*error=</code><code>nil</code><code>;</code>
<code>//擷取伺服器資料</code>
<code>NSData</code> <code>*requestData= [</code><code>NSURLConnection</code> <code>sendSynchronousRequest:request returningResponse:</code><code>nil</code> <code>error:&error];</code>
<code>if</code> <code>(error) {</code>
<code> </code><code>NSLog</code><code>(@</code><code>"錯誤資訊:%@"</code><code>,[error localizedDescription]);</code>
<code>}</code><code>else</code><code>{</code>
<code> </code><code>NSString</code> <code>*result=[[</code><code>NSString</code> <code>alloc]initWithData:requestData encoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
<code> </code><code>NSLog</code><code>(@</code><code>"傳回結果:%@"</code><code>,result);</code>
<code>}</code>
代碼很多,需要解釋一下:
①URL如果有中文無法傳遞,需要編碼一下:
<code>[urlStr stringByAddingPercentEscapesUsingEncoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
②設定網路請求中的代碼,有兩個參數,最後一個設定請求的時間,這個不用說什麼,重點說下緩存政策cachePolicy,系統中的定義如下:
<code>typedef</code> <code>NS_ENUM</code><code>(</code><code>NSUInteger</code><code>, </code><code>NSURLRequestCachePolicy</code><code>)</code>
<code>{</code>
<code> </code><code>NSURLRequestUseProtocolCachePolicy</code> <code>= 0,</code>
<code> </code><code>NSURLRequestReloadIgnoringLocalCacheData</code> <code>= 1,</code>
<code> </code><code>NSURLRequestReloadIgnoringLocalAndRemoteCacheData</code> <code>= 4, </code><code>// Unimplemented</code>
<code> </code><code>NSURLRequestReloadIgnoringCacheData</code> <code>= </code><code>NSURLRequestReloadIgnoringLocalCacheData</code><code>,</code>
<code> </code><code>NSURLRequestReturnCacheDataElseLoad</code> <code>= 2,</code>
<code> </code><code>NSURLRequestReturnCacheDataDontLoad</code> <code>= 3,</code>
<code> </code><code>NSURLRequestReloadRevalidatingCacheData</code> <code>= 5, </code><code>// Unimplemented</code>
<code>};</code>
NSURLRequestUseProtocolCachePolicy(基礎政策),NSURLRequestReloadIgnoringLocalCacheData(忽略本地緩存);
NSURLRequestReloadIgnoringLocalAndRemoteCacheData(無視任何緩存政策,無論是本地的還是遠端的,總是從原位址重新下載下傳);
NSURLRequestReturnCacheDataElseLoad(首先使用緩存,如果沒有本地緩存,才從原位址下載下傳);
NSURLRequestReturnCacheDataDontLoad(使用本地緩存,從不下載下傳,如果本地沒有緩存,則請求失敗,此政策多用于離線操作);
NSURLRequestReloadRevalidatingCacheData(如果本地緩存是有效的則不下載下傳,其他任何情況都從原位址重新下載下傳);
Java服務端代碼:
<code>protected</code> <code>void</code> <code>doGet(HttpServletRequest request,</code>
<code> </code><code>HttpServletResponse response) </code><code>throws</code> <code>ServletException, IOException {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>response.setContentType(</code><code>"text/html;charset=utf-8;"</code><code>);</code>
<code> </code><code>PrintWriter out = response.getWriter();</code>
<code> </code><code>System.out.println(request.getParameter(</code><code>"username"</code><code>));</code>
<code> </code><code>System.out.println(request.getParameter(</code><code>"password"</code><code>));</code>
<code> </code><code>if</code> <code>(request.getParameter(</code><code>"type"</code><code>) == </code><code>null</code><code>) {</code>
<code> </code><code>out.print(</code><code>"預設測試"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>if</code> <code>(request.getParameter(</code><code>"type"</code><code>).equals(</code><code>"async"</code><code>)) {</code>
<code> </code><code>out.print(</code><code>"異步Get請求"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>out.print(</code><code>"Get請求"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
最終效果如下:
Post請求的代碼,基本跟Get類型,有注釋,就不多解釋了:
19
<code>//設定URL</code>
<code> </code><code>NSURL</code> <code>*url=[</code><code>NSURL</code> <code>URLWithString:@</code><code>"http://localhost:8080/MyWeb/Book"</code><code>];</code>
<code> </code><code>//建立請求</code>
<code> </code><code>NSMutableURLRequest</code> <code>*request = [[</code><code>NSMutableURLRequest</code> <code>alloc]initWithURL:url cachePolicy:</code><code>NSURLRequestUseProtocolCachePolicy</code> <code>timeoutInterval:10];</code>
<code> </code>
<code> </code><code>[request setHTTPMethod:@</code><code>"POST"</code><code>];</code><code>//設定請求方式為POST,預設為GET</code>
<code> </code><code>NSString</code> <code>*param= @</code><code>"Name=部落格園&Address=http://www.cnblogs.com/xiaofeixiang&Type=post"</code><code>;//設定參數</code>
<code> </code><code>NSData</code> <code>*data = [param dataUsingEncoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
<code> </code><code>[request setHTTPBody:data];</code>
<code> </code><code>//連接配接伺服器</code>
<code> </code><code>NSData</code> <code>*received = [</code><code>NSURLConnection</code> <code>sendSynchronousRequest:request returningResponse:</code><code>nil</code> <code>error:</code><code>nil</code><code>];</code>
<code> </code><code>NSString</code> <code>*result= [[</code><code>NSString</code> <code>alloc]initWithData:received encoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
<code> </code><code>NSLog</code><code>(@</code><code>"%@"</code><code>,result);</code>
Java服務端代碼:
<code>protected</code> <code>void</code> <code>doPost(HttpServletRequest request,</code>
<code> </code><code>HttpServletResponse response) throws ServletException, IOException {</code>
<code> </code><code>request.setCharacterEncoding(</code><code>"utf-8"</code><code>); </code>
<code> </code><code>response.setContentType(</code><code>"text/html;charset=utf-8"</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"姓名:"</code> <code>+ request.getParameter(</code><code>"Name"</code><code>));</code>
<code> </code><code>System.out.println(</code><code>"位址:"</code> <code>+ request.getParameter(</code><code>"Address"</code><code>));</code>
<code> </code><code>System.out.println(</code><code>"類型:"</code> <code>+ request.getParameter(</code><code>"Type"</code><code>));</code>
<code> </code><code>if</code> <code>(request.getParameter(</code><code>"Type"</code><code>).equals(</code><code>"async"</code><code>)) {</code>
<code> </code><code>out.print(</code><code>"異步請求"</code><code>);</code>
<code> </code><code>out.print(</code><code>"Post請求"</code><code>);</code>
效果如下:
異步實作的時候需要實作協定NSURLConnectionDataDelegate,Get異步代碼如下:
<code> </code><code>NSString</code> <code>*urlStr=[</code><code>NSString</code> <code>stringWithFormat:@</code><code>"http://localhost:8080/MyWeb/Book?username=%@&password=%s&type=async"</code><code>,@</code><code>"FlyElephant"</code><code>,</code><code>"keso"</code><code>];</code>
<code> </code><code>urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
<code> </code><code>NSURLRequest</code> <code>*request = [[</code><code>NSURLRequest</code> <code>alloc]initWithURL:url cachePolicy:</code><code>NSURLRequestUseProtocolCachePolicy</code> <code>timeoutInterval:10];</code>
<code> </code><code>NSURLConnection</code> <code>*connection = [[</code><code>NSURLConnection</code> <code>alloc]initWithRequest:request delegate:</code><code>self</code><code>];</code>
實作協定的連接配接過程的方法:
20
21
22
23
24
25
26
27
28
29
30
31
<code>-(</code><code>void</code><code>)connection:(</code><code>NSURLConnection</code> <code>*)connection didReceiveResponse:(</code><code>NSURLResponse</code> <code>*)response{</code>
<code> </code><code>NSHTTPURLResponse</code> <code>*res = (</code><code>NSHTTPURLResponse</code> <code>*)response;</code>
<code> </code>
<code> </code><code>NSLog</code><code>(@</code><code>"%@"</code><code>,[res allHeaderFields]);</code>
<code> </code><code>self</code><code>.myResult = [</code><code>NSMutableData</code> <code>data];</code>
<code>////接收到伺服器傳輸資料的時候調用,此方法根據資料大小執行若幹次</code>
<code>-(</code><code>void</code><code>)connection:(</code><code>NSURLConnection</code> <code>*)connection didReceiveData:(</code><code>NSData</code> <code>*)data</code>
<code> </code><code>[</code><code>self</code><code>.myResult appendData:data];</code>
<code>//資料傳輸完成之後執行方法</code>
<code>-(</code><code>void</code><code>)connectionDidFinishLoading:(</code><code>NSURLConnection</code> <code>*)connection</code>
<code> </code><code>NSString</code> <code>*receiveStr = [[</code><code>NSString</code> <code>alloc]initWithData:</code><code>self</code><code>.myResult encoding:</code><code>NSUTF8StringEncoding</code><code>];</code>
<code> </code><code>NSLog</code><code>(@</code><code>"%@"</code><code>,receiveStr);</code>
<code>//網絡請求時出現錯誤(斷網,連接配接逾時)執行方法</code>
<code>-(</code><code>void</code><code>)connection:(</code><code>NSURLConnection</code> <code>*)connection didFailWithError:(</code><code>NSError</code> <code>*)error</code>
<code> </code><code>NSLog</code><code>(@</code><code>"%@"</code><code>,[error localizedDescription]);</code>
異步傳輸的過程資料需要拼接,是以這個時候需要設定一個屬性接收資料:
<code>@property</code> <code>(strong,</code><code>nonatomic</code><code>) </code><code>NSMutableData</code> <code>*myResult;</code>
Post異步傳遞代碼:
<code> </code><code>//設定請求</code>
<code> </code><code>NSString</code> <code>*param= @</code><code>"Name=keso&Address=http://www.cnblogs.com/xiaofeixiang&Type=async"</code><code>;//設定參數</code>
異步的請求比較簡單,需要的方法都已經被封裝好了,需要注意資料是動态拼接的,請求的代碼都是在Java Servlet中實作的,Java項目中的目錄如下:
Book.java中代碼如下:
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
<code>import</code> <code>java.io.IOException;</code>
<code>import</code> <code>java.io.PrintWriter;</code>
<code>import</code> <code>java.net.URLDecoder;</code>
<code>import</code> <code>java.net.URLEncoder;</code>
<code>import</code> <code>javax.servlet.ServletException;</code>
<code>import</code> <code>javax.servlet.annotation.WebServlet;</code>
<code>import</code> <code>javax.servlet.http.HttpServlet;</code>
<code>import</code> <code>javax.servlet.http.HttpServletRequest;</code>
<code>import</code> <code>javax.servlet.http.HttpServletResponse;</code>
<code>/**</code>
<code> </code><code>* Servlet implementation class Book</code>
<code> </code><code>*/</code>
<code>@WebServlet</code><code>(</code><code>"/Book"</code><code>)</code>
<code>public</code> <code>class</code> <code>Book </code><code>extends</code> <code>HttpServlet {</code>
<code> </code><code>private</code> <code>static</code> <code>final</code> <code>long</code> <code>serialVersionUID = 1L;</code>
<code> </code><code>/**</code>
<code> </code><code>* @see HttpServlet#HttpServlet()</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>Book() {</code>
<code> </code><code>super</code><code>();</code>
<code> </code><code>// TODO Auto-generated constructor stub</code>
<code> </code><code>* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse</code>
<code> </code><code>* response)</code>
<code> </code><code>protected</code> <code>void</code> <code>doGet(HttpServletRequest request,</code>
<code> </code><code>HttpServletResponse response) </code><code>throws</code> <code>ServletException, IOException {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>response.setContentType(</code><code>"text/html;charset=utf-8;"</code><code>);</code>
<code> </code><code>PrintWriter out = response.getWriter();</code>
<code> </code><code>System.out.println(request.getParameter(</code><code>"username"</code><code>));</code>
<code> </code><code>System.out.println(request.getParameter(</code><code>"password"</code><code>));</code>
<code> </code><code>if</code> <code>(request.getParameter(</code><code>"type"</code><code>) == </code><code>null</code><code>) {</code>
<code> </code><code>out.print(</code><code>"預設測試"</code><code>);</code>
<code> </code><code>if</code> <code>(request.getParameter(</code><code>"type"</code><code>).equals(</code><code>"async"</code><code>)) {</code>
<code> </code><code>out.print(</code><code>"異步Get請求"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>out.print(</code><code>"Get請求"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse</code>
<code> </code><code>protected</code> <code>void</code> <code>doPost(HttpServletRequest request,</code>
<code> </code><code>request.setCharacterEncoding(</code><code>"utf-8"</code><code>); </code>
<code> </code><code>response.setContentType(</code><code>"text/html;charset=utf-8"</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"姓名:"</code> <code>+ request.getParameter(</code><code>"Name"</code><code>));</code>
<code> </code><code>System.out.println(</code><code>"位址:"</code> <code>+ request.getParameter(</code><code>"Address"</code><code>));</code>
<code> </code><code>System.out.println(</code><code>"類型:"</code> <code>+ request.getParameter(</code><code>"Type"</code><code>));</code>
<code> </code><code>if</code> <code>(request.getParameter(</code><code>"Type"</code><code>).equals(</code><code>"async"</code><code>)) {</code>
<code> </code><code>out.print(</code><code>"異步Post請求"</code><code>);</code>
<code> </code><code>out.print(</code><code>"Post請求"</code><code>);</code>
①同步請求一旦發送,程式将停止使用者互動,直至伺服器傳回資料完成,才可以進行下一步操作(例如登入驗證);
②異步請求不會阻塞主線程,會建立一個新的線程來操作,發出異步請求後,依然可以對UI進行操作,程式可以繼續運作;
③Get請求,将參數直接寫在通路路徑上,容易被外界看到,安全性不高,位址最多255位元組;
④Post請求,将參數放到body裡面,安全性高,不易被捕獲;
本文轉自Fly_Elephant部落格園部落格,原文連結:http://www.cnblogs.com/xiaofeixiang/p/4306786.html,如需轉載請自行聯系原作者