HTTP请求:iOS网络功能——高级HTTP操作

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

头信息操作进阶

添加请求头

删除请求头

查看响应头

主要的请求头

猜你喜欢

转载自blog.csdn.net/run_in_road/article/details/113741947