GET和POST请求是HTTP请求方式中最最为常见的。

在说请求方式之前先熟悉HTTP的通信过程:

请求

1、请求行 :
请求方法、请求路径、HTTP协议的版本号

GET /MJServer/resources/images/1.jpg HTTP/1.1

2、请求头 : client的一些描写叙述信息

Host: 192.168.1.111:8080
// client想訪问的server主机地址

     User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0   //
client的类型,client的软件环境

      Accept: text/html,
// client所能接收的数据类型

      Accept-Language: zh-cn
// client的语言环境

      Accept-Encoding: gzip
// client支持的数据压缩格式

3、请求体 : POST请求才有这个东西

请求參数,发给server的数据

响应

1、状态行(响应行): HTTP协议的版本号、响应状态码、响应状态描写叙述

Server: Apache-Coyote/1.1
// server的类型

       Content-Type: image/jpeg
// 返回数据的类型

       Content-Length: 56811
// 返回数据的长度

        Date: Mon, 23 Jun 2014 12:54:52 GMT
// 响应的时间

2、 响应头:server的一些描写叙述信息

Content-Type : server返回给client的内容类型

Content-Length : server返回给client的内容的长度(比方文件的大小)

3、 实体内容(响应体)

server返回给client详细的数据,比方文件数据

NSMutableURLRequest(注意:非NSURLRequest 由于这个对象是不可变的)

1、设置超时时间(默认60s)

request.timeoutInterval =
15;

2、设置请求方式

request.HTTPMethod =
@"POST";

3、设置请求体

request.HTTPBody = data;

4、设置请求头  比如例如以下是传JSON数据的表头设置

[request setValue:@"application/json"
forHTTPHeaderField:@"Content-Type"];

GET和POST对照:

GET(默认情况是get请求):

特点:GET方式提交的參数直接拼接到url请求地址中。多个參数用&隔开。比如:http://localhost:8080/myService/login?username=123&pwd=123

缺点:

1、在url中暴露了全部的请求数据,不太安全

2、因为浏览器和server对URL长度有限制,因此在URL后面附带的參数是有限制的,通常不能超过1KB

- (IBAction)login {
NSString *loginUser = self.userName.text;
NSString *loginPwd = self.pwd.text;
if (loginUser.length==0) {
[MBProgressHUD showError:@"请输入用户名!"];
return;
} if (loginPwd.length==0) {
[MBProgressHUD showError:@"请输入password。"];
return;
} // 添加蒙板
[MBProgressHUD showMessage:@"正在登录中....."]; //默认是get方式请求:get方式參数直接拼接到url中
NSString *urlStr = [NSString stringWithFormat:@"http://localhost:8080/myService/login?username=%@&pwd=%@",loginUser,loginPwd]; //post方式请求,參数放在请求体中
//NSString *urlStr = @"http://localhost:8080/myService/login"; //URL转码
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; //urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //设置超时时间(默认60s)
request.timeoutInterval = 15; //设置请求方式
request.HTTPMethod = @"POST"; //设置请求体
NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", loginUser,loginPwd];
// NSString --> NSData
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; // 设置请求头信息
[request setValue:@"iphone" forHTTPHeaderField:@"User-Agent"]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//隐藏蒙板
[MBProgressHUD hideHUD];
if(connectionError || data==nil){
[MBProgressHUD showError:@"网络繁忙! 稍后再试。"];
return ;
}else{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSString *error = dict[@"error"];
if (error) {
[MBProgressHUD showError:error];
}else{
NSString *success = dict[@"success"];
[MBProgressHUD showSuccess:success];
}
}
}]; }

POST

特点:

1、把全部请求參数放在请求体(HTTPBody)中

2、理论上讲。发给server的数据的大小是没有限制

3、请求数据相对安全(没有绝对的安全)

 // 1.URL
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/myService/order"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.timeoutInterval = 15;
request.HTTPMethod = @"POST"; NSDictionary *orderInfo = @{
@"shop_id" : @"1111",
@"shop_name" : @"的地方地方",
@"user_id" : @"8919"
};
NSData *json = [NSJSONSerialization dataWithJSONObject:orderInfo options:NSJSONWritingPrettyPrinted error:nil];
request.HTTPBody = json; // 5.设置请求头:这次请求体的数据不再是普通的參数,而是一个JSON数据
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if(connectionError || data==nil){
[MBProgressHUD showError:@"网络繁忙!稍后再试! "];
return ;
}else{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSString *error = dict[@"error"];
if (error) {
[MBProgressHUD showError:error];
}else{
NSString *success = dict[@"success"];
[MBProgressHUD showSuccess:success];
}
}
}];

url转码问题(URL中不能包括中文)

1、这方法已过时

NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

2、官方推荐使用:

NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

iOS开发实践之GET和POST请求的更多相关文章

  1. iOS 开发实践之 Auto Layout

    原:http://xuexuefeng.com/autolayout/?utm_source=tuicool 本文是博主 iOS 开发实践系列中的一篇,主要讲述 iOS 中 Auto Layout(自 ...

  2. iOS开发实践-OOM治理

    概览 说起iOS的OOM问题大家第一想到的应该更多的是内存泄漏(Memory Leak),因为无论是从早期的MRC还是2011年Apple推出的ARC内存泄漏问题一直是iOS开发者比较重视的问题,比如 ...

  3. iOS开发——网络篇——HTTP/NSURLConnection(请求、响应)、http响应状态码大全

    一.网络基础 1.基本概念> 为什么要学习网络编程在移动互联网时代,移动应用的特征有几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图只有通过网络跟外界进行数据交互.数据更新, ...

  4. iOS开发】canOpenURLl 和修改http请求

    控制台输出 如图是在我启动一个 Xcode + iOS 的 App 之后,控制台的输出. 这在 Xcode 时,是不会有的情况,原因是[为了强制增强数据访问安全, iOS9 默认会把所有从NSURLC ...

  5. iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求

    这篇文章会提供一种在 Cocoa 层拦截所有 HTTP 请求的方法,其实标题已经说明了拦截 HTTP 请求需要的了解的就是 NSURLProtocol. 由于文章的内容较长,会分成两部分,这篇文章介绍 ...

  6. iOS开发实践之网络检測Reachability

    在网络应用开发中.有时须要对用户设备的网络状态进行实时监控.以至于对用户进行友好提示 或者依据不同网络状态处理不一样的逻辑(如视频播放app,依据当前的网络情况自己主动切换视频清晰度等等).用Reac ...

  7. iOS开发实践:一个类微博客户端从启动到与用户交互的过程

    本文基于数据字典和数据流图两种工具讲述一个完整微博客户端的实现.数据字典和数据流图都可以用来表达线程的执行流程,同时定义了需要的类,是进一步设计类的基础. 数据字典实际上是一张表,表的第一个字段是程序 ...

  8. iOS开发笔记_5.线程,HTTP请求,定时器

    说起线程,不会陌生了,操作系统课程里已经详细介绍了这个东东,这里就不解释了,想要了解的问问百度或者翻翻书. 线程的创建 总结了昨天的学习,有下面几种创建的方式. //第一种 NSThread *t = ...

  9. iOS开发——基础篇——get和post请求的区别

    HTTP 定义了与服务器交互的不同方法,最常用的有4种,Get.Post.Put.Delete,如果我换一下顺序就好记了,Put(增),Delete(删),Post(改),Get(查),即增删改查,下 ...

随机推荐

  1. phpexcel乱码问题

    php导出Excel乱码,只需在header函数前加入ob_end_clean();//清除缓冲区,避免乱码

  2. MyBatis学习总结(1)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  3. 洛谷 P1556 幸福的路

    P1556 幸福的路 题目描述 每天,John都要为了农场里N(1≤N≤10)头牛的健康和幸福四处奔波. 每头牛的位置可以描述为一个二维坐标,John从坐标原点(0,0)出发.为了使路径更有趣,Joh ...

  4. java之IO处理

    File文件基础 文件与文件夹抽象路径名称的表示.其构造方法有四个 File(File parent,String child):从抽象父文件夹下创建一个File实例. File(String par ...

  5. nodejs即时聊天

    一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错.自己略加改动,感觉挺不错的.官网上给的样例非常easy,以下改进了一点,实现了历史消息的推送. demo地址:chat.code ...

  6. MongoDB数据操作之删除与游标处理

    删除数据(比较常用) 范例:清空infos集合中的内容.表.文档.成员. db.infos.remove({"url":/-/}); 默认情况下都删除,第二个条件设为true,只删 ...

  7. MyBatis数据持久化(五)数据源配置优化

    在前面的教程中,我们把数据库的驱动.用户名.密码等配置项全部写在 SqlMapConfig.xml中: <dataSource type="POOLED"> <p ...

  8. OpenGL编程(六)通过三角形绘画出3D模型

    使用三角形绘制3D模型 三角形是基本的多边形,任何多变形都能由三角形组成.三角形是由三个顶点的连线组成.三个点分别是v0:v1:v2. 1.绕法 从某个顶点开始,有两种连线的方法,顺时针和逆时针,这是 ...

  9. 数据库应用_innobackupex备份与恢复

    1.Percona软件介绍; 2.innobackupex的备份与恢复 一, Percona软件 在学习percona软件之前,我们看一下物理备份和mysqldump备份有哪些缺陷. 物理备份的缺点: ...

  10. confluence6.0.3安装文档

    一.Atlassian Confluence 6.0.3安装文档包含内容 1.wiki的安装步骤: 2.旧系统迁移中碰到的无法编辑和问题和解决方案: 3.wiki源码安装包.连接mysql用的jar包 ...