天天看点

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,如需转载请自行联系原作者