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