我正在尝试通过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做的事情吗?
任何帮助都将不胜感激。
答案 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的答案可能是一个很好的解决方法。