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, // Unimplemented
    NSURLRequestReloadIgnoringCacheData = 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 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类型,有注释,就不多解释了:

   //设置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服务端代码:

	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异步代码如下:

   //设置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异步传递代码:

   //设置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中代码如下:

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

时间: 2024-10-08 23:37:51

iOS开发-Get请求,Post请求,同步请求和异步请求的相关文章

iOS开发——网络编程OC篇&(三)数据请求

一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; 3 NSURL *url=[NSURL URLWithString:urlStr]; 4 5 // 2.创建请求对

IOS开发之—— 在AFN基础上进行的网络请求的封装

网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求成功:解析数据,刷新页面 4请求失败做处理 VPKCResponse.h VPKCResponse.m VPKCRequestManager.h VPKCRequestManager.m 定义两个文件继承NSObject. VPKCResponse.h #import <Foundation/Fou

iOS开发--用户点击频繁,多个异步网络请求取消问题?

一.业务环境描述 当一个view同时添加两个tableView为subView的时候,两个tableView分别为mainTable和subTable. 当用户点击mainTable上的某一条数据时,再去发送网络请求subTable中的数据. 存在问题的地方:例如当用户在mainTable上频繁点击各条cell上面的数据时,会出现subTable中数据错乱问题.那么如何取消之前的网络请求呢??? 注:网络请求为异步请求 二.解决方法 1.实例化一个AFHTTPRequestOperationMa

网络请求数据(同步GET,异步GET)

////GET:将请求所需要传的参数,直接封装到URL中,缺点:1.不安全  2.url长度有限制,如果参数较多,会封装失败,导致无法请求 //POST:包含基础的url以及参数体,也就是说,参数跟url是分开的,比较安全且不用顾虑url的长度 //同步:当执行某个操作时,只有当其完全执行结束,才回去执行下面的操作,缺点:如果遇到耗时操作,会比较卡//异步:多个任务同时执行 #import "ViewController.h" #define BaseUrl @"http:/

js学习总结----ajax中的http请求方式及同步编程和异步编程

一.请求方式 var xhr = createXHR(); xhr.open("get","/getList?num=12",true); xhr.open("post","/getList",true); xhr.send('{"name":"zhangsan","age":7}') //HTTP METHOD;客户端向服务器端发送请求的方式 //以下的请求方式不管

详解Ajax请求(四)——多个异步请求的执行顺序

首先提出一个问题:点击页面上一个按钮发送两个ajax请求,其中一个请求会不会等待另一个请求执行完毕之后再执行? 答案是:不会,这两个异步请求会同时发送,至于执行的快与慢,要看响应的数据量的大小及后台逻辑的复杂程度. 从异步请求的执行原理来看,我们知道当一个异步请求发送时,浏览器不会处于锁死.等待的状态,从一个异步请求发送到获取响应结果的期间,浏览器还可以进行其它的操作.这就意味着多个异步请求的执行时并行的. 下面我们还是从一个例子来看一下这个问题. 要求:ajax1从后台请求下拉列表的数据,aj

iOS开发之新版本微信授权提示“未知的应用请求”

昨天更新了微信之后突然发现应用微信授权登录提示“未知的应用请求” 代码都没有动,上个版本还可以,更新了微信就出问题了 理论上微信新版本都会兼容老的api啊,后面更新SDK一发现是注册的时候用的方法有问题 之前用的错误方法 [WXApi registerApp:@"微信appid" withDescription:@"应用标识"]; 改为下面的方法就可以了 [WXApi registerApp:@"微信appid"]; 其实微信在早几个版本就建议用

网络请求数据(同步POST,异步POST)

//同步POST -(void)synPost{    //获取URL接口,不含参数    NSString *str = @"http://www.haninfo.cc:2060/Login/LoginData.asmx/Login";    //转码---拼接方法,为避免参数是汉字时,打印结果不显示汉字    str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    NSURL *u

【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)

(1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL); for

iOS开发——网络编程Swift篇&amp;(四)异步Get方式

异步Get方式 1 // MARK: - 异步Get方式 2 func asynchronousGet() 3 { 4 //创建NSURL对象 5 var url:NSURL! = NSURL(string: "http://m.weather.com.cn/data/101010100.html") 6 7 //创建请求对象 8 var urlRequest : NSURLRequest = NSURLRequest(URL: url, cachePolicy: NSURLReque