20

我正在尝试通过 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

4 回答 4

54

更改此行:

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

至:

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

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

于 2014-04-15T07:34:21.797 回答
1

对我来说它看起来不错。您确定您提供了有效的令牌吗?尝试捕捉这样的错误

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];

希望能帮助到你

于 2013-09-19T05:19:21.207 回答
1

@isair 的回答确实是救命稻草。

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

NSURLRequest定义了一组保留的 HTTP 标头。令人惊讶的Authrorization是,它是其中的一部分。

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

  • 内容长度

  • 授权

  • 联系

  • 主持人

  • 代理验证

  • 代理授权

  • WWW-认证

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

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

就我而言,我正在编写一个使用Authorization标头与后端 Django 服务器进行身份验证的 React webapp。login-required该应用程序在桌面 Chrome 上表现完美,但由于缺少标头,始终无法访问iPhone(Safari 和 Chrome)上的 API Authorization

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

于 2019-12-04T04:30:42.517 回答
0

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

于 2019-05-16T11:27:17.660 回答