Как я могу обойти эту ошибку NSURLConnection?
В настоящее время я создаю приложение для iOS, которое использует REST-клиент Obma-C от Kosmaczewski для подключения к общедоступному API.
Этот публичный API использует базовую аутентификацию через HTTPS.
Проблема, с которой я столкнулся, заключается в том, что, когда я пытаюсь предоставить имя пользователя / пароль с помощью интерфейса оболочки, происходит сбой. После некоторого поиска, я считаю, что это связано с ошибкой, обсуждаемой в этих двух потоках:
В настоящее время для продвижения разработки я предоставляю имя пользователя / пароль в URL в формате: https://admin:pass@site.com/
Мне действительно нужно найти решение, чтобы сделать это правильно, хотя. Мне не нравится идея взломать его, сгенерировав строку в кодировке base64 и изменив заголовок аутентификации. Я также не хочу отходить от этой оболочки (которую очень легко реализовать) на использование чего-то вроде ASIHTTPRequest.
Так что мой вопрос будет: это действительно ошибка? Есть ли другое объяснение того, что происходит? Какие методы вы бы предложили, чтобы попытаться обойти это?
Если вы хотите посмотреть на какой-либо код, посмотрите упаковку, так как я просто ее реализую. https://github.com/akosma/iphonerestwrapper
Большое спасибо!
1 ответ
Хотя вы не хотите уходить из класса-оболочки, похоже, это ошибка в классе-оболочке. NSUrlConnection не имеет этой проблемы, если используется сама по себе, и это также очень легко реализовать. Вот пример кода для работы со службами REST, которые используют HTTP-аутентификацию, если вы решите пойти по этому пути. Очень просто
-(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 сама по себе очень мощная, поэтому усложнение всегда приводит к большим ошибкам:)
Для получения дополнительной информации: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html