Ios NSURLConnection授权标头不工作

Ios NSURLConnection授权标头不工作,ios,curl,http-headers,nsurlconnection,get-request,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

我试图通过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所做的吗


任何帮助都将不胜感激。

对我来说,这看起来很好。您确定您提供了有效的令牌吗? 试着像这样捕捉错误

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];
希望它有助于改变这一行:

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


显然,如果URL末尾没有斜杠,iOS会删除授权标头。这个问题几乎让我失去了两天的睡眠。

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

@isair的答案真是救命稻草

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

NSURLRequest定义了一组。令人惊讶的是,
authorization
是其中的一部分

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

  • 内容长度

  • 授权书

  • 联系

  • 主人

  • 代理验证

  • 代理授权

  • WWW认证

如果您为其中一个保留标头设置了值,系统可能会忽略您设置的值,或者用其自身的值覆盖该值,或者干脆不发送该值。此外,确切的行为可能会随着时间的推移而改变。为了避免像这样的混淆问题,不要直接设置这些标题

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

在我的例子中,我正在编写一个React Web应用程序,它使用
授权
头与后端Django服务器进行身份验证。该应用程序在桌面Chrome上表现完美,但由于缺少
授权
标题,始终无法访问iPhone(Safari和Chrome)上所需的
登录
API


理想的解决方案是完全避免使用
授权
。但是如果您正在与一个专门需要它的后端框架通信(例如Django Rest框架的令牌身份验证)@isair的答案是一个很好的解决办法。

+1是最简单的解决方案。同样的问题困扰着我,幸运的是,我没有失眠。然而,我试图寻找更多的信息,不幸的是没有人有明确的解释。知道为什么(直到什么时候:)会很有帮助。非常感谢,我刚刚遇到了同样的问题。iOS似乎把斜杠结尾的url和非斜杠结尾的url分为两种情况。你救了我一天,我在上面花了4个关键小时,如果找到了你的答案,谢谢你,甚至不知道在尝试不同的事情上浪费了多少时间!-我花了4个小时调试这个问题。
NSURL *aUrl = [NSURL URLWithString: @"http://generericfakeapi.com/user/profile/"];