首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》21.6 深入学习:HTTP请求主体

关灯直达底部

NSURLSessionTask会使用HTTP协议来和Web服务进行通信,发送和接收的数据必须符合HTTP规范。图21-7显示的是本章所编写的Nerdfeed向服务器发送的实际数据示例。

NSURLRequest可以提供多个方法,用来设置HTTP请求的各个方面。NSURLRequest对象会根据具体的设置,生成符合规范的发送数据。

图21-7 HTTP请求格式

HTTP请求分为请求行、HTTP头(header)和HTTP主体(body)三个部分。其中的HTTP主体是可选的。请求行(在Apple的API中称为状态行)是HTTP请求的第一行数据,其作用是告诉服务器客户端想做什么。对本例中的请求,客户端想要通过GET方法得到位于/courses.json的资源(此外,该请求还指明了当前使用的HTTP规范的版本号)。

这里的GET命令是一种HTTP方法。虽然HTTP规范定义了多种HTTP方法,最常见的是GET和POST。NSURLRequest默认会使用GET方法,GET方法代表客户端想要从服务器得到某些信息。而信息所在的位置称为Request-URI(/courses.json)。

在互联网早期,Request-URI通常是某个文件在服务器上的路径。例如,请求http://www.website.com/index.html会返回文件index.html,然后由浏览器在其窗口中显示该文件。现在,也可以用Request-URI来表示服务器实现的某个Web服务。例如,本章的Nerdfeed会向courses服务发送请求,提供相应的参数并得到服务器返回的JSON数据。一样是通过GET方法获取信息,但是服务器能够根据传入的参数执行更多的任务。

除了从服务器获取信息,还可以向服务器发送信息。例如,很多Web服务支持上传照片。某个客户端应用可以通过服务请求将照片数据传给服务器。向服务器发送数据时,需要使用HTTP的POST方法。POST方法代表客户端想要向服务器发送某些信息,并将这些信息包含在(可选的)HTTP主体中。HTTP请求的主体是传送给服务器的数据,这些数据通常是XML格式、JSON格式或Base-64编码后的数据。

如果某个HTTP请求包含主体,就必须包含Content-Length头。NSURLRequest会计算主体的大小并自动添加Content-Length头。代码如下:

NSURL *someURL = [NSURL URLWithString:@“http://www.photos.com/upload”];

UIImage *image = [self profilePicture];

NSData *data = UIImagePNGRepresentation(image);

NSMutableURLRequest *req =

[NSMutableURLRequest requestWithURL:someURL

cachePolicy:NSURLRequestReloadIgnoringCacheData

timeoutInterval:90];

// 加入HTTP主体数据,NSMutableURLRequest对象会自动加入相应的Content-Length头

req.HTTPBody = data;

// 这行代码会修改请求行中的HTTP方法

req.HTTPMethod = @“POST”;

// 也可以通过代码“手动”设置Content-Length

[req setValue:[NSString stringWithFormat:@“%d”, data.length]

forHTTPHeaderField:@“Content-Length”];