我目前正在尝试从iOS设备进行REST调用。我的代码在
之下 NSString *restCallString = [NSString stringWithFormat:@"MyURL"];
NSURL *url = [NSURL URLWithString:restCallString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
[request setHTTPMethod:@"GET"];
[request addValue:Value1 forHTTPHeaderField:@"Header1"];
[request addValue:Value2 forHTTPHeaderField:@"Header2"];
[request setURL:[NSURL URLWithString:restCallString]];
@try{
_currentConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
@catch(NSError *e){
NSLog(@"%@", e.description);
}
每当调用此方法时,都会收到以下错误:未提供身份验证凭据。但是,令我困惑的是,如果我通过HTTP Web控制台发送相同的GET请求,它就能完美运行。换句话说,使用相同的URL和相同的2个头 - 值对,我在Web控制台上获得有效响应,并且看不到身份验证错误。可能导致这种情况的原因是什么?
答案 0 :(得分:1)
您正在设置HTTP标头。这不起作用,因为HTTP标头不包含在$_GET
或$_POST
中,因为它们不是内容,而是对预期内容的描述。
请改为尝试:
NSURL *url = [NSURL URLWithString:[restCallString stringByAppendingFormat:@"?Header1=%@&Header2=%@", Value1, Value2]];
因为您必须知道该网址符合RFC 1738。
答案 1 :(得分:1)
如果我通过HTTP Web控制台发送相同的GET请求,它可以正常运行
我怀疑您的网络控制台正在利用SessionAuthentication
- 即如果您已经在浏览器中登录了自己的网站,那么API会根据您的会话Cookie对您进行身份验证。
Django Rest Framework提供了各种身份验证方法,也有第三方选项。最简单的方法可能是提供的Token Auth方法。
确保已启用此功能。在管理员(或通过提供的视图)中创建令牌,并确保您已设置Authorization
标头。它需要看起来像这样:
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
所以你的Objective-C会像:
[request addValue:[NSString stringWithFormat:@"Token %@", yourToken]
forHTTPHeaderField:@"Authorization"];
希望这能让你开始。