NSMutableURLRequest с несколькими заголовками

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

Который добавляет другой заголовок в экземпляр запроса.