NSURLConnection授权标头无法正常工作

时间:2013-09-19 03:03:53

标签: ios curl http-headers nsurlconnection get-request

我正在尝试通过NSURLConnection在HTTP标头中发送OAuth访问令牌,但它似乎没有发送标头,因为API一直给我一个错误,说“必须提供授权令牌”。

这是我正在使用的代码:

NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:30.0];

[request addValue:[NSString stringWithFormat:@"OAuth %@", token] forHTTPHeaderField:@"Authorization"];

[request setHTTPMethod:@"GET"];

NSError *error = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error: &error];

NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData:returnData options:kNilOptions error:&error];
NSLog(@"Response : %@", JSONDictionary);

这是API的cURL命令的一个示例:

curl 'http://generericfakeapi.com/user/profile' -H 'Authorization: OAuth YourAuthToken'

这不是我基本上通过NSURLConnection做的事情吗?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:48)

更改此行:

NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile"];

要:

NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile/"];

如果URL的末尾没有斜杠,显然iOS会删除Authorization标头。这个问题让我睡了两天。

答案 1 :(得分:0)

对我而言看起来很好。你确定你有一个有效的令牌吗? 尝试捕捉这样的错误

if (error) {
    NSLog(@"error : %@", error.description);
}

我的代码运作良好:

NSURL *jsonURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://....ID=%i", cellID]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:jsonURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120.0];
[request setValue:@"Basic ...." forHTTPHeaderField:@"Authorization"];
NSURLResponse *response;
NSError * error  = nil;
NSData *POSTReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

希望有所帮助

答案 2 :(得分:0)

我有同样的问题。就我而言,我将“ http”更改为“ https”,并且一切正常

答案 3 :(得分:0)

@isair的回答确实是救生员。

如果您有兴趣,只需添加根本原因:

NSURLRequest 定义了一组reserved HTTP headers。令人惊讶的是,Authrorization是其中的一部分。

  

URL加载系统为您处理HTTP协议的各个方面(HTTP 1.1持久连接,代理,身份验证等)。作为此支持的一部分,URL加载系统负责某些HTTP标头:

     
      
  • 内容长度

  •   
  • 授权

  •   
  • 连接

  •   
  • 主机

  •   
  • 代理身份验证

  •   
  • 代理授权

  •   
  • WWW身份验证

  •   
     

如果您为这些保留的标头之一设置了一个值,则系统可能会忽略您设置的值,或用其自己的值覆盖它,或者干脆不发送它。此外,确切的行为可能会随着时间而改变。为避免造成此类混淆,请勿直接设置这些标头。

在@isair的情况下,很有可能没有斜杠的URL触发了这种“过滤”行为。这可能是实现上的不一致,但我们无权访问源代码来验证这一点。

就我而言,我正在编写一个使用Authorization标头向后端Django服务器进行身份验证的React Webapp。该应用程序在台式机Chrome上运行良好,但由于缺少login-required标头,始终无法访问iPhone(Safari和Chrome)上的Authorization API。

理想的解决方案是完全避免使用Authorization。但是,如果您正在与特别需要它的后端框架进行通信(例如Django Rest Framework的令牌身份验证)。 @isair的答案可能是一个很好的解决方法。