iOS开发-Get请求,Post请求,同步请求和异步请求

简介:

标题中的Get和Post是请求的两种方式,同步和异步属于实现的方法,Get方式有同步和异步两种方法,Post同理也有两种。稍微有点Web知识的,对Get和Post应该不会陌生,常说的请求处理响应,基本上请求的是都是这两个哥们,Http最开始定义的与服务器交互的方式有八种,不过随着时间的进化,现在基本上使用的只剩下这两种,有兴趣的可以参考本人之前的博客Http协议中Get和Post的浅谈,iOS客户端需要和服务端打交道,Get和Post是跑不了的,本文中包含iOS代码和少量Java服务端代码,开始正题吧.

Get和Post同步请求

Get和Post同步请求的时候最常见的是登录,输入各种密码才能看到的功能,必须是同步,异步在Web上局部刷新的时候用的比较多,比较耗时的时候执行异步请求,可以让客户先看到一部分功能,然后慢慢刷新,举个例子就是餐馆吃饭的时候点了十几个菜,给你先上一两个吃着,之后给别人上,剩下的慢慢上。大概就是这样的。弄了几个按钮先上图:

先贴下同步请求的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//设置URL路径
  NSString  *urlStr=[ NSString  stringWithFormat:@ "http://localhost:8080/MyWeb/Book?username=%@&password=%@&type=get" ,@ "博客园" ,@ "keso" ];
  urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ];
  NSURL  *url=[ NSURL  URLWithString:urlStr];
 
//通过URL设置网络请求
NSURLRequest  *request = [[ NSURLRequest  alloc]initWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy  timeoutInterval:10];
 
NSError  *error= nil ;
//获取服务器数据
NSData  *requestData= [ NSURLConnection  sendSynchronousRequest:request returningResponse: nil  error:&error];
if  (error) {
     NSLog (@ "错误信息:%@" ,[error localizedDescription]);
} else {
     NSString  *result=[[ NSString  alloc]initWithData:requestData encoding: NSUTF8StringEncoding ];
     NSLog (@ "返回结果:%@" ,result);
 
}

代码很多,需要解释一下:

①URL如果有中文无法传递,需要编码一下:

1
[urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ];

②设置网路请求中的代码,有两个参数,最后一个设置请求的时间,这个不用说什么,重点说下缓存策略cachePolicy,系统中的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef  NS_ENUM ( NSUInteger NSURLRequestCachePolicy )
{
     NSURLRequestUseProtocolCachePolicy  = 0,
 
     NSURLRequestReloadIgnoringLocalCacheData  = 1,
     NSURLRequestReloadIgnoringLocalAndRemoteCacheData  = 4,  // Unimplemented
     NSURLRequestReloadIgnoringCacheData  NSURLRequestReloadIgnoringLocalCacheData ,
 
     NSURLRequestReturnCacheDataElseLoad  = 2,
     NSURLRequestReturnCacheDataDontLoad  = 3,
 
     NSURLRequestReloadRevalidatingCacheData  = 5,  // Unimplemented
};

 NSURLRequestUseProtocolCachePolicy(基础策略),NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存);

NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载);

NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载);

NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作);

NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载);

Java服务端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected  void  doGet(HttpServletRequest request,
         HttpServletResponse response)  throws  ServletException, IOException {
     // TODO Auto-generated method stub
     response.setContentType( "text/html;charset=utf-8;" );
     PrintWriter out = response.getWriter();
     System.out.println(request.getParameter( "username" ));
     System.out.println(request.getParameter( "password" ));
     if  (request.getParameter( "type" ) ==  null ) {
         out.print( "默认测试" );
     else  {
         if  (request.getParameter( "type" ).equals( "async" )) {
             out.print( "异步Get请求" );
         else  {
             out.print( "Get请求" );
         }
     }
}

 最终效果如下:

Post请求的代码,基本跟Get类型,有注释,就不多解释了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//设置URL
  NSURL  *url=[ NSURL  URLWithString:@ "http://localhost:8080/MyWeb/Book" ];
  //创建请求
  NSMutableURLRequest  *request = [[ NSMutableURLRequest  alloc]initWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy  timeoutInterval:10];
  
  [request setHTTPMethod:@ "POST" ]; //设置请求方式为POST,默认为GET
  
  NSString  *param= @ "Name=博客园&Address=http://www.cnblogs.com/xiaofeixiang&Type=post" ;//设置参数
  
  NSData  *data = [param dataUsingEncoding: NSUTF8StringEncoding ];
  
  [request setHTTPBody:data];
  
  //连接服务器
  NSData  *received = [ NSURLConnection  sendSynchronousRequest:request returningResponse: nil  error: nil ];
 
  NSString  *result= [[ NSString  alloc]initWithData:received encoding: NSUTF8StringEncoding ];
 
  NSLog (@ "%@" ,result);

 Java服务端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected  void  doPost(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {
     // TODO Auto-generated method stub
     request.setCharacterEncoding( "utf-8" ); 
     response.setContentType( "text/html;charset=utf-8" );
     PrintWriter out = response.getWriter();
     System.out.println( "姓名:"  + request.getParameter( "Name" ));
     System.out.println( "地址:"  + request.getParameter( "Address" ));
     System.out.println( "类型:"  + request.getParameter( "Type" ));
     if  (request.getParameter( "Type" ).equals( "async" )) {
         out.print( "异步请求" );
     else  {
         out.print( "Post请求" );
     }
 
}

效果如下:

Get和Post异步请求

异步实现的时候需要实现协议NSURLConnectionDataDelegate,Get异步代码如下:

1
2
3
4
5
6
7
8
9
10
//设置URL路径
  NSString  *urlStr=[ NSString  stringWithFormat:@ "http://localhost:8080/MyWeb/Book?username=%@&password=%s&type=async" ,@ "FlyElephant" , "keso" ];
     urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding ];
  
  NSURL  *url=[ NSURL  URLWithString:urlStr];
  //创建请求
  NSURLRequest  *request = [[ NSURLRequest  alloc]initWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy  timeoutInterval:10];
  
  //连接服务器
  NSURLConnection  *connection = [[ NSURLConnection  alloc]initWithRequest:request delegate: self ];

 实现协议的连接过程的方法:

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
-( void )connection:( NSURLConnection  *)connection didReceiveResponse:( NSURLResponse  *)response{
     NSHTTPURLResponse  *res = ( NSHTTPURLResponse  *)response;
     
     NSLog (@ "%@" ,[res allHeaderFields]);
     
     self .myResult = [ NSMutableData  data];
}
 
////接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
-( void )connection:( NSURLConnection  *)connection didReceiveData:( NSData  *)data
{
     [ self .myResult appendData:data];
     
}
 
//数据传输完成之后执行方法
-( void )connectionDidFinishLoading:( NSURLConnection  *)connection
 
{
     NSString  *receiveStr = [[ NSString  alloc]initWithData: self .myResult encoding: NSUTF8StringEncoding ];
     
     NSLog (@ "%@" ,receiveStr);
     
}
 
//网络请求时出现错误(断网,连接超时)执行方法
-( void )connection:( NSURLConnection  *)connection didFailWithError:( NSError  *)error
 
{
     NSLog (@ "%@" ,[error localizedDescription]);
}

异步传输的过程数据需要拼接,所以这个时候需要设置一个属性接收数据:

1
@property  (strong, nonatomic NSMutableData  *myResult;

效果如下:

 

Post异步传递代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//设置URL
  NSURL  *url=[ NSURL  URLWithString:@ "http://localhost:8080/MyWeb/Book" ];
  
  //设置请求
  NSMutableURLRequest  *request = [[ NSMutableURLRequest  alloc]initWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy  timeoutInterval:10];
  
  [request setHTTPMethod:@ "POST" ]; //设置请求方式为POST,默认为GET
  
  NSString  *param= @ "Name=keso&Address=http://www.cnblogs.com/xiaofeixiang&Type=async" ;//设置参数
  
  NSData  *data = [param dataUsingEncoding: NSUTF8StringEncoding ];
  
  [request setHTTPBody:data];
  //连接服务器
  NSURLConnection  *connection = [[ NSURLConnection  alloc]initWithRequest:request delegate: self ];

效果如下:

异步的请求比较简单,需要的方法都已经被封装好了,需要注意数据是动态拼接的,请求的代码都是在Java Servlet中实现的,Java项目中的目录如下:

Book.java中代码如下:

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
import  java.io.IOException;
import  java.io.PrintWriter;
import  java.net.URLDecoder;
import  java.net.URLEncoder;
 
import  javax.servlet.ServletException;
import  javax.servlet.annotation.WebServlet;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;
 
/**
  * Servlet implementation class Book
  */
@WebServlet ( "/Book" )
public  class  Book  extends  HttpServlet {
     private  static  final  long  serialVersionUID = 1L;
 
     /**
      * @see HttpServlet#HttpServlet()
      */
     public  Book() {
         super ();
         // TODO Auto-generated constructor stub
     }
 
     /**
      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
      *      response)
      */
     protected  void  doGet(HttpServletRequest request,
             HttpServletResponse response)  throws  ServletException, IOException {
         // TODO Auto-generated method stub
         response.setContentType( "text/html;charset=utf-8;" );
         PrintWriter out = response.getWriter();
         System.out.println(request.getParameter( "username" ));
         System.out.println(request.getParameter( "password" ));
         if  (request.getParameter( "type" ) ==  null ) {
             out.print( "默认测试" );
         else  {
             if  (request.getParameter( "type" ).equals( "async" )) {
                 out.print( "异步Get请求" );
             else  {
                 out.print( "Get请求" );
             }
         }
     }
 
     /**
      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
      *      response)
      */
     protected  void  doPost(HttpServletRequest request,
             HttpServletResponse response)  throws  ServletException, IOException {
         // TODO Auto-generated method stub
         request.setCharacterEncoding( "utf-8" ); 
         response.setContentType( "text/html;charset=utf-8" );
         PrintWriter out = response.getWriter();
         System.out.println( "姓名:"  + request.getParameter( "Name" ));
         System.out.println( "地址:"  + request.getParameter( "Address" ));
         System.out.println( "类型:"  + request.getParameter( "Type" ));
         if  (request.getParameter( "Type" ).equals( "async" )) {
             out.print( "异步Post请求" );
         else  {
             out.print( "Post请求" );
         }
 
     }
 
}

Get和Post总结

①同步请求一旦发送,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作(例如登录验证);

②异步请求不会阻塞主线程,会建立一个新的线程来操作,发出异步请求后,依然可以对UI进行操作,程序可以继续运行;

③Get请求,将参数直接写在访问路径上,容易被外界看到,安全性不高,地址最多255字节;

④Post请求,将参数放到body里面,安全性高,不易被捕获;


本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4306786.html,如需转载请自行联系原作者

相关文章
|
11天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
4天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
15天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
16天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
118 1
|
2月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
2月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
66 1
|
18天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
39 9
|
18天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。