天天看點

iOS開發-Get請求,Post請求,同步請求和異步請求

Get和Post同步請求的時候最常見的是登入,輸入各種密碼才能看到的功能,必須是同步,異步在Web上局部重新整理的時候用的比較多,比較耗時的時候執行異步請求,可以讓客戶先看到一部分功能,然後慢慢重新整理,舉個例子就是餐館吃飯的時候點了十幾個菜,給你先上一兩個吃着,之後給别人上,剩下的慢慢上。大概就是這樣的。弄了幾個按鈕先上圖:

iOS開發-Get請求,Post請求,同步請求和異步請求

先貼下同步請求的代碼:

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=%@&amp;password=%@&amp;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:&amp;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>

 最終效果如下:

iOS開發-Get請求,Post請求,同步請求和異步請求

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=部落格園&amp;Address=http://www.cnblogs.com/xiaofeixiang&amp;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>

效果如下:

iOS開發-Get請求,Post請求,同步請求和異步請求

異步實作的時候需要實作協定NSURLConnectionDataDelegate,Get異步代碼如下:

<code> </code><code>NSString</code> <code>*urlStr=[</code><code>NSString</code> <code>stringWithFormat:@</code><code>"http://localhost:8080/MyWeb/Book?username=%@&amp;password=%s&amp;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>

iOS開發-Get請求,Post請求,同步請求和異步請求

Post異步傳遞代碼:

<code> </code><code>//設定請求</code>

<code> </code><code>NSString</code> <code>*param= @</code><code>"Name=keso&amp;Address=http://www.cnblogs.com/xiaofeixiang&amp;Type=async"</code><code>;//設定參數</code>

iOS開發-Get請求,Post請求,同步請求和異步請求

異步的請求比較簡單,需要的方法都已經被封裝好了,需要注意資料是動态拼接的,請求的代碼都是在Java Servlet中實作的,Java項目中的目錄如下:

iOS開發-Get請求,Post請求,同步請求和異步請求

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,如需轉載請自行聯系原作者