客户端使用服务端API接口时,需构造HTTP请求头,一般情况下是初始化一个NSMutableURLRequest,然后设置请求方法、请求体,请求头,如下:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:bodyData]; [request setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)bodyData.length] forHTTPHeaderField:@"Content-Length"]; [request setValue:authorization forHTTPHeaderField:@"Authorization"];
猿题库的网络请求(YTKNetwork)已把请求方法、请求体,请求头等封装好允许用户重载进行自定义。包括:
#pragma mark - Subclass Override ///============================================================================= /// @name Subclass Override ///============================================================================= /// Called on background thread after request succeded but before switching to main thread. Note if /// cache is loaded, this method WILL be called on the main thread, just like `requestCompleteFilter`. - (void)requestCompletePreprocessor; /// Called on the main thread after request succeeded. - (void)requestCompleteFilter; /// Called on background thread after request succeded but before switching to main thread. See also /// `requestCompletePreprocessor`. - (void)requestFailedPreprocessor; /// Called on the main thread when request failed. - (void)requestFailedFilter; /// The baseURL of request. This should only contain the host part of URL, e.g., http://www.example.com. /// See also `requestUrl` - (NSString *)baseUrl; /// The URL path of request. This should only contain the path part of URL, e.g., /v1/user. See alse `baseUrl`. /// /// @discussion This will be concated with `baseUrl` using [NSURL URLWithString:relativeToURL]. /// Because of this, it is recommended that the usage should stick to rules stated above. /// Otherwise the result URL may not be correctly formed. See also `URLString:relativeToURL` /// for more information. /// /// Additionaly, if `requestUrl` itself is a valid URL, it will be used as the result URL and /// `baseUrl` will be ignored. - (NSString *)requestUrl; /// Optional CDN URL for request. - (NSString *)cdnUrl; /// Requset timeout interval. Default is 60s. /// /// @discussion When using `resumableDownloadPath`(NSURLSessionDownloadTask), the session seems to completely ignore /// `timeoutInterval` property of `NSURLRequest`. One effective way to set timeout would be using /// `timeoutIntervalForResource` of `NSURLSessionConfiguration`. - (NSTimeInterval)requestTimeoutInterval; /// Additional request argument. - (nullable id)requestArgument; /// Override this method to filter requests with certain arguments when caching. - (id)cacheFileNameFilterForRequestArgument:(id)argument; /// HTTP request method. - (YTKRequestMethod)requestMethod; /// Request serializer type. - (YTKRequestSerializerType)requestSerializerType; /// Response serializer type. See also `responseObject`. - (YTKResponseSerializerType)responseSerializerType; /// Username and password used for HTTP authorization. Should be formed as @[@"Username", @"Password"]. - (nullable NSArray<NSString *> *)requestAuthorizationHeaderFieldArray; /// Additional HTTP request header field. - (nullable NSDictionary<NSString *, NSString *> *)requestHeaderFieldValueDictionary; /// Use this to build custom request. If this method return non-nil value, `requestUrl`, `requestTimeoutInterval`, /// `requestArgument`, `allowsCellularAccess`, `requestMethod` and `requestSerializerType` will all be ignored. - (nullable NSURLRequest *)buildCustomUrlRequest; /// Should use CDN when sending request. - (BOOL)useCDN; /// Whether the request is allowed to use the cellular radio (if present). Default is YES. - (BOOL)allowsCellularAccess; /// The validator will be used to test if `responseJSONObject` is correctly formed. - (nullable id)jsonValidator; /// This validator will be used to test if `responseStatusCode` is valid. - (BOOL)statusCodeValidator;
请求头通过重写方法- (NSDictionary *)requestHeaderFieldValueDictionary;
返回一个字典,然后在方法- (AFHTTPRequestSerializer *)requestSerializerForRequest:(YTKBaseRequest *)request;
中将网络请求序列化,供构造NSURLSessionTask使用。
- (NSDictionary *)requestHeaderFieldValueDictionary { NSString *paraUrlString = AFQueryStringFromParameters([self requestArgument]); NSString *authorization =[[YTKNetworkConfig sharedConfig] getAuthorization:[self requestUrl]]; return @{@"Accept-Encoding":@"gzip, deflate", @"Content-Type":@"application/x-www-form-urlencoded; charset=utf-8", @"Content-Length":[NSString stringWithFormat:@"%lu", (unsigned long)paraUrlString.length], @"Authorization":authorization}; }
下面具体说说请求头里几个字段的含义:
表示本地可以接收压缩格式的数据,而服务器在处理时就将大文件压缩再发回客户端。客户端接收完成后在本地对数据进行解压操作。
gzip:用于UNⅨ系统的文件压缩,HTTP协议上的gzip编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用gzip让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来。一般对纯文本内容可压缩到原大小的40%,从而使得数据传输速度加快。当然这也会增加服务器的负载,一般服务器中都安装有这个功能模块的。
deflate:一种使用LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩无专利算法的压缩技术。
HTTP内容编码和HTTP压缩的区别:在HTTP协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码。 从而达到压缩的目的。 也可以使用其他的编码把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。所以我们说HTTP压缩,其实就是HTTP内容编码的一种。
HTTP压缩的过程:
1、客户端发送Http request 给Web服务器, request 中有Accept-Encoding: gzip, deflate。 (告诉服务器, 浏览器支持gzip压缩)。
2、服务器接到request后, 生成原始的Response, 其中有原始的Content-Type和Content-Length。
3、服务器通过gzip,来对Response进行编码, 编码后header中有Content-Type和Content-Length(压缩后的大小), 并且增加了Content-Encoding:gzip. 然后把Response发送给客户端。
4、客户端接到Response后,根据Content-Encoding:gzip来对Response 进行解码。 获取到原始response后, 然后处理数据的显示。
其它:compress表明实体采用Unix的文件压缩程序;identity表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况。gzip, compress, 以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。 其中gzip通常效率最高, 使用最为广泛。
表示内容类型,一般是指客户端存在的Content-Type,用于定义网络文件的类型和网页的编码,决定客户端将以什么形式、什么编码读取这个文件。即用于标识发送或接收到的数据的类型,客户端根据该参数来决定数据的打开方式。
application/x-www-form-urlencoded:数据被编码为名称/值对,这是标准的编码格式;multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
1、当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
2、当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
表示述HTTP消息实体的传输长度。消息实体长度:即Entity-length,压缩之前的message-body的长度;
消息实体的传输长度:Content-length,压缩后的message-body的长度。(参数拼接成的字典)
HTTP基本认证是一种用来允许Web浏览器,或其他客户端程序在请求时提供以用户名和口令形式的凭证的登录方式。授权机制根据服务端定的规则确定。
认证 (authentication) 和授权 (authorization) 的区别:你要登机,你需要出示你的身份证和机票,身份证是为了证明你张三确实是你张三,这就是 authentication;而机票是为了证明你张三确实买了票可以上飞机,这就是 authorization。 你要登陆论坛,输入用户名张三,密码1234,密码正确,证明你张三确实是张三,这就是 authentication;再一check用户张三是个版主,所以有权限加精删别人帖,这就是 authorization。
站在HTML角度:
1、GET在浏览器回退时是无害的,而POST会再次提交请求。
2、GET产生的URL地址可以被Bookmark,而POST不可以。
3、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4、GET请求只能进行url编码,而POST支持多种编码方式。
5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6、GET请求在URL中传送的参数是有长度限制的,而POST么有。
7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9、GET参数通过URL传递,POST放在Request body中。
站在HTTP的角度:
1、HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
2、HTTP没有要求,如果Method是POST数据就要放在BODY中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。也就是说,GET和POST与数据如何传递没有关系。HTTP协议对GET和POST都没有对长度的限制。安全不安全和GET、POST没有关系。
3、GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
1、1** 信息,服务器收到请求,需要请求者继续执行操作
2、2** 成功,操作被成功接收并处理
3、3** 重定向,需要进一步的操作以完成请求
4、4** 客户端错误,请求包含语法错误或无法完成请求
5、5** 服务器错误,服务器在处理请求的过程中发生了错误
以上是HTTP请求头的详细内容。更多信息请关注PHP中文网其他相关文章!