iOS中的HTTP协议 如何使用GET和POST
来源:互联网 发布:c语言程序设计编程题库 编辑:程序博客网 时间:2024/05/22 14:49
一、URL
基本介绍
URL的全称是Uniform Resource Locator(统一资源定位符)
通过一个URL,能找到互联网上唯一的一个资源
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式:协议//主机地址/路径
协议: 不同的协议,代表着不同的资源查找方式、资源传输方式
主机地址: 存放资源的主机(服务器)的IP地址(域名)
路径: 资源在主机(服务器)中的具体位置URL中常见的协议
(1)HTTP
超文本传输协议,访问的是远程的网络资源,格式是http://
(2)file
访问的是本地计算机上的资源,格式是file://(不用加主机地址)
(3)mailto
访问的是电子邮箱地址,格式是mailto:
(4)FTP
访问的是共享主机的文件资源,格式是ftp://
二、HTTP协议
- HTTP协议简介
不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议 - HTTP协议的作用
HTTP的全称是Hypertext Transfer Protocol,超文本传输协议
(1)规定客户端和服务器之间的数据传输格式
(2)让客户端和服务器能有效的进行数据沟通 - 为什么选择HTTP?
(1)简单快速 因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
(2)灵活 HTTP允许传输任意类型的数据
(3)HTTP0.9和1.0使用非持续链接 限制每次链接只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接,这种方式可以节省传输时间 - HTTP的通信过程
要想使用HTTP协议向服务器索取数据,得先了解HTTP通信的完整过程
完整的HTTP通信可分为两大步骤
(1)请求:客户端想服务器索要数据
(2)响应:服务器返回客户端相应的数据
三、HTTP通信过程 - 请求和响应
HTTP通信过程 - 请求
HTTP协议规定:一个完整的由客户端发给服务器的HTTP请求中包含以下内容
请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /Server/resources/images/1.jpg HTTP/1.1请求头:包含了对客户端的环境的描述、客户端请求的主机地址等信息
Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址(8080端口)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
Accept: text/html, /// 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式请求体:客户端发给服务器的具体数据,比如文件数据(iOS中NSData格式)
HTTP通信过程 - 响应
客户端向服务器发送请求,服务器应当做出相应,即返回数据给客户端
HTTP协议规定:一个完整的HTTP相应包含以下内容:
状态行:包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK(200表示成功)
响应头:包含了对服务器的描述、对返回数据的描述
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
实体内容:服务器返回给客户端的具体数据,比如文件数据
响应状态码
四、发送HTTP请求的方法
- 简单说明
在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
PUT:增
DELETE:删
POST:改
GET:查
最常用的就是GET和POST - GET和POST请求
要想使用GET和POST请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的账号、密码
GET和POST对比:GET和POST的主要区别表现在数据传递上
GET
在请求URL后面以”?”的形式跟上发给服务器的参数,多个参数之间用”&”隔开,比如http://ww.test.com/login?username=123&pwd=234&type=JSON
由于浏览器和服务器对URL长度有限制,因此URL后面附带的参数是有限制的,通常不能超过1KB
POST
发给服务器的参数全部放在请求体中
理论上,POST传递的数量没有限制(具体看服务器的处理能力) GET和POST的选择
选择GET和POST的建议
(1)如果要传递大量的数据,比如文件上传,只能用POST请求
(2)GET的安全性比POST差,如果包含机密\敏感信息,建议用POST
(3)如果仅仅是索取数据(数据查询),建议使用GET
(4)如果是增加、修改、删除数据、建议使用POSTiOS中发送HTTP请求的方案
在iOS中,常见的发送HTTP请求(GET和POST)的结局方案有
(1)苹果原生
NSURLConnection:用法简单,最古老的方案(已经弃用)
NSURLSession:iOS7新出的技术,功能比NSURLConnection更加强大
CFNetwork:NSURL*的底层,纯C语言(看惯了OC会非常讨厌C)
(2)第三方框架
ASIHttpRequest:功能强大(本人没用过不知道不支持ARC)
AFNetworking:简单易用,提供了基本够用的常用功能 不支持异步加载
MKNetworkKit:有ASI的功能有AFN的简洁但是会有小bug
下面的代码使用socket做发送的httpGET请求 这里没有使用到请求体
#import "HTTP.h"#import <arpa/inet.h>#import <netdb.h>@implementation HTTP#pragma mark -- 发送请求+(void)sendHTTPRequestWithMsg:(NSString *)msg ip:(NSString *)ip port:(NSNumber *)port{ //这里直接使用主线程会卡死阻塞主线程 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //1.创建socket int socketID=socket(AF_INET, SOCK_STREAM, 0); //连接配置服务器并发送信息 //初始化addr struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family=AF_INET; //这里都需要转换一下 需要的是C语言的 addr.sin_port=htonl([port intValue]); const char *address=[ip UTF8String]; inet_pton(AF_INET, address, &addr.sin_addr); //实现连接 int connectID=connect(socketID,(struct sockaddr *)&addr,sizeof(addr)); if (connectID==-1) { NSLog(@"connect error"); return ; } //发送信息 发送http的请求信息 long sendID=send(socketID, [msg UTF8String], strlen([msg UTF8String]), 0); if (sendID==-1) { NSLog(@"send error"); return; }; //接受完整的数据 NSMutableString *data=[NSMutableString string]; BOOL isOK; while (!isOK) { char *str=malloc(5000); //接受数据 如果返回值大于0则代表还有数据需要传递,如果返回值等于0则代表数据传递完毕如果小于0则代表接受出错 long recvID=recv(socketID, str, 50000, 0); NSLog(@"recvID:%ld",recvID); if (recvID>0) { //将获取到的数据拼接在一起 [data appendFormat:@"%s",str]; }else{ isOK=YES; } } NSLog(@"data is:%@",data); });}+(void)loadHTTPWithURL:(NSURL *)url{ //1.通过URL获取域名 NSString *host=url.host; //2.通过host解析IP地址 struct hostent *host_ip=gethostbyname([host UTF8String]); //3.获取ip地址 struct in_addr **addr_list=(struct in_addr **)host_ip->h_addr_list; //遍历打印IP地址 会有很多 用一个就可以 for (int i=0; addr_list[i]!=NULL; i++) { NSLog(@"ip is:%s",inet_ntoa(*addr_list[i])); } NSString *ip=[NSString stringWithCString:inet_ntoa(*addr_list[0]) encoding:NSUTF8StringEncoding]; //获取端口号 如果提供了端口号就用提供的 如果没提供可以使用默认的80 http 80 ftp 21 NSNumber *port=url.port; if (!port) { port=@80; } //获取msg信息 NSString *sendMsg=[self makeHTTPRequest:url]; //使用socket做请求 [self sendHTTPRequestWithMsg:sendMsg ip:ip port:port];}+(NSString *)makeHTTPRequest:(NSURL *)url{ //拼接请求信息 \r\n == 换行 NSString *sendMsg = [NSString stringWithFormat:@"GET %@ HTTP/1.1\r\n",url.path]; sendMsg = [sendMsg stringByAppendingFormat:@"Host: %@\r\n",url.host]; sendMsg =[sendMsg stringByAppendingString:@"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n\r\n"]; sendMsg =[sendMsg stringByAppendingString:@"Content-Encoding: utf-8\r\n"]; sendMsg =[sendMsg stringByAppendingString:@"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0\r\n"]; sendMsg =[sendMsg stringByAppendingString:@"Connection: close\r\n"]; return sendMsg;}@end
- iOS中的HTTP协议 如何使用GET和POST
- HTTP协议中的GET和POST方法
- http协议中的get和post
- Post和Get在http中的使用
- HTTP中的GET和POST何时使用
- iOS中Http协议get和post主要区别
- iOS开发-http协议、get和post请求
- HTTP 协议中的GET 和POST 的区别
- http协议中的post和get有何区别?
- iOS http get和post
- iOS http get和post
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET
- HTTP协议及POST与GET操作差异,C#中如何使用POST、GET等
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- FPGA 独立按键消抖
- OAuth学习笔记
- Unity GameObject.activeSelf, GameObject.activeInHierarchy,GameObject.SetActive和SetActiveRecursively
- 奋斗的小蜗牛
- JAVA中的接口和抽象类
- iOS中的HTTP协议 如何使用GET和POST
- 【3x+1猜想】思考:x一定会缩减成比它小的值
- android dialog类详解
- HDU 2894 DeBruijin(欧拉回路)
- U3D物体移动方式小结
- 51Nod 1051 最大子矩阵和(二维最大字段和dp)
- LeetCode60. Permutation Sequence
- sha1 加密
- Mysql数据库连接脚本