您的位置:首页 > 理论基础 > 计算机网络

Http网络请求中的get和post请求简介以及二者区别

2015-04-08 13:28 531 查看
对于http网络请求其实有很多种方式,只是平时比较常用的是Get请求和Post请求,相对来说Post请求更加常用一些,下面先展示一下都有哪些http相关的请求方式:

请求方法是请求一定的Web页面的程序或用于特定的URL。可选用下列几种:

GET: 请求指定的页面信息,并返回实体主体。

HEAD: 只请求页面的首部。

POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

PUT: 从客户端向服务器传送的数据取代指定的文档的内容。

DELETE: 请求服务器删除指定的页面。

OPTIONS: 允许客户端查看服务器的性能。

TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。

PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。

MOVE: 请求服务器将指定的页面移至另一个网络地址。

COPY: 请求服务器将指定的页面拷贝至另一个网络地址

LINK: 请求服务器建立链接关系。

UNLINK: 断开链接关系。

WRAPPED: 允许客户端发送经过封装的请求。

Extension-mothed:在不改动协议的前提下,可增加另外的方法。

以上不再做详细额解释,下面来介绍一下Get请求和Post请求,以及两者之间的区别

一、Get请求:

对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc。如果url中出现中文或其它特殊字符的话,如:http://localhost:8080 /servlet?msg=杭州,浏览器会对url进行URL encode,然后发送给服务器。URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串
"%xy" 表示,其中xy为该字节的两位十六进制表示形式,我们能看到2个很重要的问题:

第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;

第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。

完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。

二、Post请求:

POST方法也是HTTP协议中的一个重要组成部分。POST方法一般用来向目的服务器发出更新请求,并附有请求实体。

关于Post更详细的信息请查看链接:

点击打开链接

三、Get请求与Post请求的区别:

Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求

Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改

Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的,所以Get传输的数据有大小限制,一般为1k,Post请求把表单数据和参数放在HTTP请求体中,并且没有长度限制,所以可以传递较大的数据。

GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。在服务器端,用Request.QueryString来获取Get方式提交来的数据,Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post。

四、http请求的基本格式和响应的基本格式:

1.http请求基本格式

===================================================

<request line> 请求行

<headers> 请求头(参数头)

<blank line> 空白行

[<request-body>] 请求实体(get没有 post有)

======================================

请求行:位于请求消息的第一行

格式:请求方式 资源路径 HTTP版本号<CRLF回车换行空格制表符>

2.http响应基本格式

===================================================

<status line> 状态行

<headers> 响应头

[<request-body>] 响应实体

======================================

唯一真正的区别在于第一行中用状态行代替了请求行。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

五、http请求返回状态码:

状态码含义
100~199表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299表示成功接收请求并已完成整个处理过程
300~399为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址
400~499客户端的请求有错误
500~599服务器端出现错误
常用状态码:
200(正常):表示一切正常,返回的是正常请求结果

302/307(临时重定向):指出被请求的文档已被临时移动到别处,此文档的新的URL在Location响应头中给出。

304(未修改):表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求。

404(找不到):服务器上不存在客户机所请求的资源。

500(服务器内部错误):服务器端的程序发生错误

六.基本的get和post请求的代码(简单展示)

1.同步get请求

//第一步,创建URL
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];

//第二步,通过URL创建网络请求
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

//NSURLRequest初始化方法第一个参数:请求访问路径,第二个参数:缓存协议,第三个参数:网络请求超时时间(秒)
其中缓存协议是个枚举类型包含:

NSURLRequestUseProtocolCachePolicy(基础策略)
NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)
NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)
NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)
NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)
NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)

//第三步,连接服务器
NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];

NSLog(@"%@",str);


2.同步post请求

//第一步,创建URL
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];

//第二步,创建请求
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

[request setHTTPMethod:@"POST"];//设置请求方式为POST,默认为GET
NSString *str = @"type=focus-c";//设置参数
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];

//第三步,连接服务器
NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *str1 = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];

NSLog(@"%@",str1);


3.异步get请求

//第一步,创建url
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];

//第二步,创建请求
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

//第三步,连接服务器
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];


4.异步post请求

//第一步,创建url
NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];

//第二步,创建请求
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

[request setHTTPMethod:@"POST"];
NSString *str = @"type=focus-c";

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];

//第三步,连接服务器
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];


5.异步请求代理方法

//接收到服务器回应的时候调用此方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

NSLog(@"%@",[res allHeaderFields]);

self.receiveData = [NSMutableData data];
}

//接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

[self.receiveData appendData:data];
}

//数据传完之后调用此方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *receiveStr = [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding];

NSLog(@"%@",receiveStr);
}

//网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%@",[error localizedDescription]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: