HTTP协议(二)之HTTP请求

一、HTTP请求的方法

在HTTP/1.1协议中,定义了8种发送HTTP请求的方法,有GET、POST、OPTION、HEAD、PUT、DELETE、TRACE、CONNECT、PACH。根据HTTP协议的解释,不同的方法对资源有不同的操作方式:

1、PUT:增

2、DELETE:删

3、POST:改

4、GET:查

其中最常用的时GET和POST。GET和POST的主要区别在数据的传递上。

1、GET

在URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如:

http://localhost:8080/MJServer/login?username=name&pwd=123

由于浏览器和服务器对URL的长度限制,因此在URL后面附带的参数是有限制的,通常不超过1KB。

2、POST

POST发给服务器的参数都放在请求体中,理论上POST传递的数据大小是没有限制的。

3、如何选择

如果要传递大量数据,比如文件上传,只能用POST请求。安全性来说,GET要比POST差些,如果包含一些敏感的信息建议用POST,如果仅仅是从服务器获取数据,例如查询一些信息,建议使用GET,如果是增加、修改和删除数据,建议用POST。

二、iOS中发送HTTP请求的方案

苹果原生的解决方案有:

1、NSURLConnection --用法比较简单的直接的一种方案。

2、NSURLSession     --iOS 7新出的技术,比上一种方案功能更强大

3、CFNetwork    --底层的解决方案,纯C语言

第三方框架,比较常用的有:

1、ASIHttpRequest:功能强大,但是已经停止更新

2、AFNetworking:简单易用,提供了基本够用的功能。

为了提高开发效率,建议使用第三方框架。

1、NSURLConnection

1、常用类:

NSURL:请求地址

NSURLRequest:封装一个请求,保存发给服务器的全部数据,包含一个NSURL对象、请求行、请求头、请求体等。

NSMutableURLRequest:NSURLRequest的子类

NSURLConnection:建立客户端和服务器的连接,发送NSURLRequest的数据给服务器,并接收来自服务器的响应数据。

2、NSURLConnection的使用

先看一段获取天气情况的代码:

/**
 *  获取天气信息---异步block
 */
- (void)getWeatherInfo0 {
    //显示一个加载框
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].windows.lastObject animated:YES];
    hud.labelText = @"正在加载";
    hud.dimBackground = YES;
    hud.removeFromSuperViewOnHide = YES;

    //发送HTTP请求
    NSString *str = @"http://www.weather.com.cn/adat/sk/101010100.html";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //对返回的数据进行处理,例如json解析
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSDictionary *weatherinfoDict = [dict objectForKey:@"weatherinfo"];
        [self weatherInfoHandler:weatherinfoDict];

        [hud hide:YES];
    }];

}

/**
 *  处理获取的天气信息
 *
 *  @param weatherinfoDict 天气信息
 */
- (void)weatherInfoHandler:(NSDictionary *)weatherinfoDict {
    //解析获取的内容
    //city
    NSString *city = [weatherinfoDict objectForKey:@"city"];
    UILabel *cityLabel = [[UILabel alloc] init];
    cityLabel.text = [NSString stringWithFormat:@"城市:%@", city];
    cityLabel.frame = CGRectMake(110, 90, 100, 25);
    [self.view addSubview:cityLabel];
    //发布时间
    NSString *time = [weatherinfoDict objectForKey:@"time"];
    UILabel *timeLabel = [[UILabel alloc] init];
    timeLabel.text = [NSString stringWithFormat:@"发布时间:%@", time];
    timeLabel.frame = CGRectMake(110, 120, 130, 25);
    [self.view addSubview:timeLabel];
    //风向
    NSString *wd = [weatherinfoDict objectForKey:@"WD"];
    UILabel *wdLabel = [[UILabel alloc] init];
    wdLabel.text = [NSString stringWithFormat:@"风向:%@", wd];
    wdLabel.frame = CGRectMake(110, 150, 100, 25);
    [self.view addSubview:wdLabel];
    //风级
    NSString *ws = [weatherinfoDict objectForKey:@"WS"];
    UILabel *wsLabel = [[UILabel alloc] init];
    wsLabel.text = [NSString stringWithFormat:@"风级:%@", ws];
    wsLabel.frame = CGRectMake(110, 180, 100, 25);
    [self.view addSubview:wsLabel];
}

首先使用一个获取天气的地址创建一个NSURL对象,设置请求路径;然后使用NSURL创建一个NSURLRequest对象,设置请求头和请求体,最后使用NSURLConnection发送NSURLRequest。

最后显示结果:

NSURLConnection发送请求的方法有以下几种:

1、异步请求,异步请求根据数据处理的方式可分为2种:

a、block回调方式

+ (void)sendAsynchronousRequest:(NSURLRequest*) request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler NS_AVAILABLE(10_7, 5_0);

request是构造的NSURLRequest请求,queue是后面的block处理所在的线程,completionHandler是处理获取的数据所在的block。

b、代理方式

/* Designated initializer */
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately NS_AVAILABLE(10_5, 2_0);

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;

在这种情况下,需要调用start方法开始发送请求

- (void)start NS_AVAILABLE(10_5, 2_0);

成为NSURLConnection的代理,根据需要选择遵守相应的代理

1. NSURLConnectionDelegate
2. NSURLConnectionDataDelegate
3. NSURLConnectionDownloadDelegate

下面是使用代理处理方式发送请求的代码:

/**
 *  获取天气信息---异步代理方式
 */
- (void)getWeatherInfo1 {
    //发送HTTP请求
    NSString *str = @"http://www.weather.com.cn/adat/sk/101010100.html";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    [connection start];
}

#pragma mark 代理回调
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    if (dict) {
        NSDictionary *weatherinfoDict = [dict objectForKey:@"weatherinfo"];
        [self weatherInfoHandler:weatherinfoDict];
    }
}
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately NS_AVAILABLE(10_5, 2_0);

这个方法的startImmediately如果为YES的话,表示建立连接后就立即开始下载数据,如果为NO的话需要调用start方法开始下载数据。

2、同步请求

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;

response是相应信息,有状态行和响应头等响应信息。下面是使用同步请求获取的天气信息:

/**
 *  获取天气信息---同步请求
 */
- (void)getWeatherInfo1 {
    //发送HTTP请求
    NSString *str = @"http://www.weather.com.cn/adat/sk/101010100.html";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLResponse *response = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSDictionary *weatherinfoDict = [dict objectForKey:@"weatherinfo"];
    [self weatherInfoHandler:weatherinfoDict];

    //
    NSLog(@"response %@", [response description]);
}

最后的Log输出是:

2015-07-02 15:57:25.102 HttpDemo[1915:607] response  { URL: http://www.weather.com.cn/adat/sk/101010100.html } { status code: 200, headers {
    "Accept-Ranges" = bytes;
    Age = 176;
    "CC_CACHE" = "TCP_HIT";
    "Cache-Control" = "max-age=1800";
    Connection = "keep-alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 181;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Thu, 02 Jul 2015 07:54:29 GMT";
    Expires = "Thu, 02 Jul 2015 08:25:49 GMT";
    Server = "Apache/2.2.0";
    "Set-Cookie" = "BIGipServerwww_pool=1253639229.20480.0000; path=/";
} }

同步请求会堵塞主线程,一般网络请求常用异步请求。另外,上面HTTP请求的请求方法都是默认的GET方法,如果要更改请求方法和请求体可以使用NSURLRequest的子类NSMutableURLRequest,常用设置有:

- (void)setURL:(NSURL *)URL;     //设置请求地址
- (void)setCachePolicy:(NSURLRequestCachePolicy)policy; //设置缓存策略
- (void)setTimeoutInterval:(NSTimeInterval)seconds;  //设置超时时间
- (void)setHTTPMethod:(NSString *)method;    //设置请求方法
- (void)setAllHTTPHeaderFields:(NSDictionary *)headerFields; //设置请求头部域
- (void)setHTTPBody:(NSData *)data;   //设置请求体

最后附上Demo:HTTP协议(二)demo

时间: 2024-11-05 17:09:37

HTTP协议(二)之HTTP请求的相关文章

【报文】理解HTTP协议的Request/Response(请求响应)模型

[报文]理解HTTP协议的Request/Response(请求响应)模型 系列目录 [简介]"请求/响应"模型 http://www.cnblogs.com/engraver-lxw/p/7550514.html [原理]理解HTTP协议的Request/Response(请求响应)模型 http://www.cnblogs.com/engraver-lxw/p/7550691.html [报文]理解HTTP协议的Request/Response(请求响应)模型--当前 http:/

HTTP协议 (二) --基本认证

HTTP协议 (二) 基本认证 http协议是无状态的, 浏览器和web服务器之间可以通过cookie来身份识别. 桌面应用程序(比如新浪桌面客户端, skydrive客户端)跟Web服务器之间是如何身份识别呢? 什么是HTTP基本认证 桌面应用程序也通过HTTP协议跟Web服务器交互, 桌面应用程序一般不会使用cookie, 而是把 "用户名+冒号+密码"用BASE64编码的字符串放在http request 中的header Authorization中发送给服务端, 这种方式叫H

前端知识体系(二)http请求

https://blog.csdn.net/Lammonpeter/article/details/81358387 一.DNS解析 首先DNS域名系统的作用是将输入的url域名解析成ip地址以方便对于ip对应的电脑的查找.比如:我们在浏览器地址栏输入:www.baidu.com接下来就是解析过程: 1.首先在浏览器的缓存中查找有没有域名对应的ip地址信息. 用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的IP地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地

二、HTTP请求

一.测试对象:v2ex的api 文档:https:www.v2ex.com/p/7vpTEc53 api:https://www.v2ex.com/api/topic/hot.json 最热主题:相当于首页右侧的10每条的内容 Method:GET Authentication:None 二.http请求 HTTP消息是服务器和客户端之间交换数据的方式 有两种类型的消息 请求--由客户端发送用来出发一个服务器上的动作 响应--来自服务器的应答 参考:https://developer.mozil

bottle框架学习(二)之HTTP请求

HTTP 请求方法 HTTP 协议有很多种请求方法.route默认使用GET方法,只响应GET请求.method参数可以给route()函数指定使用哪种方法.或用get(),post(),put()或delete()等函数来代替route()函数. POST 方法一般用于HTML 表单的提交.下面是一个使用POST 来实现用户登录的例子: [[email protected]]# cat login.py #!/usr/bin/envpython #coding=utf-8 from bottl

造轮子 | 怎样设计一个面向协议的 iOS 网络请求库

近期开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 须要干些啥 对于大部分 App 而言,业务层做一次网络请求通常关心的问题有例如以下几个: 怎样在任何位置发起网络请求. 表单创建. 包括请求地址.请求方式(GET/POST/--).请求头等-- 载入遮罩. 目的是堵塞 UI 交互,同一时候告知用户操作正在进行. 比方提交表单时在提交按钮上显示 "菊花",同一时候使其失效. 载入进度

造轮子 | 如何设计一个面向协议的 iOS 网络请求库

最近开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 需要干些啥 对于大部分 App 而言,业务层做一次网络请求通常关心的问题有如下几个: 如何在任意位置发起网络请求. 表单创建.包含请求地址.请求方式(GET/POST/--).请求头等-- 加载遮罩.目的是阻塞 UI 交互,同时告知用户操作正在进行.比如提交表单时在提交按钮上显示 "菊花",同时使其失效. 加载进度展示.下载上传图片

http协议(八)请求首部字段

公司服务器挂了,间歇性没活儿,抽空更下最近整理的笔记...... 请求首部字段 定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息.客户端信息以及对响应内容相关的优先级等内容 1.Accept 通知服务器用户代理可处理的媒体类型及媒体类型的相对优先级,可使用type/subtype这种形式,一次指定多种媒体类型 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 q表示权重

Amazon MWS 上传数据 (二) 构造请求

上一篇文章提到了Amazon 上传数据有三个步骤,但是每个步骤都需要构造服务和构造请求,服务是一样的,请求各不相同:这个很容易理解,这三个步骤都需要和Amazon服务器交互,所以他们的服务构造是一样的,但是三个步骤的功能各不相同,所以他们的请求(完成的功能)也不相同. 现在先来说SubmitFeed的时候需要的请求文件,下面是请求文件的代码示例: 1 #region 构造请求 Submit Amazon信息 2 private SubmitFeedRequest GetSubmitFeedReq

配置Chrome支持本地(file协议)的AJAX请求

https://www.cnblogs.com/micua/p/chrome-file-protocol-support-ajax.html 什么问题 WEB开发过程中,很多时候我们都是写一些简单的Demo,并不是开发一个完整项目,此时我们常见的操作是: 新建文件夹 新建需要的文件 在Sublime(或其他编辑器)中完成DEMO的编码 双击HTML文件,直接在浏览器中运行演示 如果此时Demo中有AJAX操作,浏览器就会报一个错: XMLHttpRequest cannot load file: