我目前正在构建一个iOS应用程序,它使用Kosmaczewski的Objective-C REST客户端/包装器连接到公共API。
此公共API使用基于HTTPS的基本身份验证。
我遇到的问题是,当我尝试使用包装器的界面提供用户名/密码时,它会崩溃。在做了一些搜索后,我认为这与这两个线程中讨论的错误有关:
目前,为了继续开发,我在网址中提供了用户名/密码,格式为:https://admin:pass@site.com
我真的需要找到一个解决方案才能正确地做到这一点。我不喜欢通过生成base64编码的字符串并修改身份验证标头来破解它的想法。我也不想使用ASIHTTPRequest这样的包装器(这很容易实现)。
所以我的问题是:这真的是一个错误吗?对于正在发生的事情还有另一种解释吗?你会建议尝试哪些技巧来解决它?
如果您想查看任何代码,请参阅包装器,因为我只是实现它。 https://github.com/akosma/iphonerestwrapper
非常感谢!
答案 0 :(得分:1)
虽然你不想离开包装类,但听起来这是包装类中的一个错误。 NSUrlConnection如果单独使用则没有此问题,并且它也非常容易实现。下面是一些使用HTTP身份验证的REST服务的示例代码,如果您选择使用该路由。非常简单
-(void)makeConnection{
NSURL *statusURL = [[NSURL alloc] initWithString:@"URLHERE"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:statusURL];
//change this to GET/PUT/POST/whatever you need
[request setHTTPMethod:@"PUT"];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[statusURL release];
[request release];
[conn start];
[conn release];
responseData = [[NSMutableData alloc] init];
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge previousFailureCount] == 0)
{
NSLog(@"Sending credentials");
NSURLCredential *newCredential;
newCredential = [NSURLCredential credentialWithUser:@"USERNAME" password:@"PASSWORD" persistence:NSURLCredentialPersistencePermanent];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
// inform the user that the user name and password
// in the preferences are incorrect
NSLog(@"credentials are no good :(");
}
}
我会避免使用包装器,因为URL加载系统本身非常强大,引入更多复杂性总会引入更多错误:)