HTTP头在提供可修改服务器响应的元数据以及向HTTP客户端提供额外信息方面扮演着重要的角色。
iOS开发者常常需要操纵请求头或是查看响应头。
使用请求方法
GET请求不包含HTTP体,不应该被滥用。
iOS应用通常都会使用POST请求向服务器发送XML或JSON数据。
下面演示如何创建JSON数据并将其作为请求体:
NSError *error;
NSDictionary *dict =
@{
@"animal" : @"dog",
@"name" : @"fido",
@"weight" : @"20"
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
if (error != nil)
{
NSLog(@"Error on encoding dictionary");
return;
}
NSLog(@"Json = %@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:jsonData];
操纵Cookie
它向服务器提供了追踪会话状态的能力,同时又无须维持客户端与服务器之间的连接。
Cookie有几个属性。
虽然不是浏览器,但iOS应用依然可以在HTTP连接中方便地使用Cookie。URL加载框架帮我们做了大量繁杂的工作以利用协议的这个特性。
经常使用到Cookie的三个地方:检索Cookie值、显式删除Cookie、手动将Cookie加到请求中。
URL加载系统只会在Cookie没有过期并且针对目标域是有效的情况下才会发送Cookie。
URL加载系统提供了两个重要对象以管理Cookie:NSHTTPCookie、NSHTTPCookieStorage。
NSHTTPCookieStorage可以通过策略值来控制Cookie的存储。
[[NSHTTPCookieStorage sharedHTTPCookieStorage]
setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
从响应中获取Cookie
NSURL *url = [NSURL URLWithString:@"https://www.meijubie.com/"];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSHTTPURLResponse *response;
NSError *error;
NSData *data = [NSURLConnection sendSynchronousRequest:req
returningResponse:&response
error:&error];
NSDictionary *headers = [response allHeaderFields];
NSLog(@"Headers = %@", headers);
NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:headers forURL:url];
[cookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL * _Nonnull stop)
{
NSLog(@"Cookie: %@", cookie);
if ([[cookie name] isEqualToString:@"JSESSIONID"])
{
NSLog(@"Found the session id");
}
}];
删除Cookie
NSHTTPCookieStorage *jar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *storageCookies = [jar cookies];
[storageCookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL * _Nonnull stop)
{
[jar deleteCookie:cookie];
}];
[[NSUserDefaults standardUserDefaults] synchronize];
针对特定的URL,根据名字来删除Cookie:
NSHTTPCookieStorage *jar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *storageCookies = [jar cookiesForURL:url];
[storageCookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL * _Nonnull stop)
{
if ([cookie.name isEqualToString:@""])
{
[jar deleteCookie:cookie];
}
}];
[[NSUserDefaults standardUserDefaults] synchronize];
创建Cookie
头信息操作进阶
添加请求头
删除请求头
查看响应头
主要的请求头