#objective-c #macos #cocoa #rest #nsurlrequest
#objective-c #macos #какао #остальное #nsurlrequest
Вопрос:
Я пытаюсь создать синхронный запрос REST к API. API использует базовую аутентификацию HTTP, поэтому в дополнение к отправке Accept: application/json
заголовка мне Authorization
также нужно указать заголовок с помощью моей пары имени пользователя и пароля в кодировке Base64. Когда я использую только один заголовок, запрос выполняется просто отлично (либо успешно аутентифицирует меня, либо указывает мой формат содержимого), но когда я использую оба заголовка, он, похоже, игнорирует Authorization
строку и возвращает «HTTP Basic access denied» (предположительно, 401).).
Так что я ни за что на свете не могу понять, что не так. Я на 100% уверен, что мои учетные данные действительны, потому что выполнение запроса через REST client работает просто отлично.Я довольно новичок в Objective-C, поэтому я думаю, что, возможно, может быть какой-то шаблон проектирования, которому я не следую. Допустимо ли вызывать setValue:forKey
подобное NSMutableDictionary
несколько раз? Я также попытался использовать setValue:forHTTPHeader
объект запроса с теми же результатами.
Вот код:
NSURL *url = [NSURL URLWithString:@"http://foo.com/api/v1/bar"];
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url];
NSMutableDictionary *headers = [NSMutableDictionary dictionary];
NSURLResponse *urlResponse;
NSError *error;
[headers setValue:@"application/json" forKey:@"Accept"];
[headers setValue:@"Basic ..." forKey:@"Authorization"];
[request setAllHTTPHeaderFields:headers];
NSData *urlData = [NSURLConnection sendSynchronousRequest:request
returningResponse:amp;urlResponse
error:amp;error];
NSString *responseString = [[NSString alloc] initWithData:urlData
encoding:NSUTF8StringEncoding];
NSLog(@"%@",responseString);
Комментарии:
1. Вы пробовали добавлять значения в запрос вместо замены всех полей заголовка? Т.е. Вместо использования
-setAllHTTPHeaderFields
используйте-addValue:forHTTPHeaderField:
.2. Кроме того, канонический метод добавления данных в словарь является
-setObject:forKey:
.3. И, наконец, является ли содержимое
Authorization
NSString
?4. Вы пробовали использовать библиотеку ASIHTTPRequest?
5. @Bavarious — Перепробовал все ваши предложения (и я указываю авторизацию как уже зашифрованный строковый литерал, как указано выше), но безуспешно.
Ответ №1:
Ответ заключается в использовании:
[request addValue:@"Basic ..." forHTTPHeaderField:@"Authorization"];
Который добавляет другой заголовок в экземпляр запроса.