setValue:@»application / json» для httpheaderfield:@»Content-Type» не работает

#ios #nsurlconnection #nsmutableurlrequest

#iOS #nsurlconnection #nsmutableurlrequest

Вопрос:

Как бы просто это ни было:

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:linkURLString]];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:10];
[request setValue:@"application/json" forHTTPHeaderField:@"Content­-Type"];
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:nil]];
 

Если я зарегистрирую значение для заголовка @"Content­-Type" , я получу ноль. И это то, что я получил в серверной части. Все остальные значения установлены и даже попробовали другие поля заголовка, работает нормально!. Я попытался установить тело перед заголовком и все равно получил ноль.

Комментарии:

1. Я не понимаю, почему это не должно фактически устанавливать заголовок Content-Type. Вы уверены, что объект запроса не освобождается или что-то в этом роде?

2. Он не выпущен, и другие параметры работают нормально.

3. Вероятно, самым простым способом найти решение было бы разместить POC-проект на Github, чтобы мы могли воспроизвести вашу проблему.

4. Серьезно, @ValerioSantinelli? POC на Github для настройки типа содержимого запроса URL :)?

5. 🙂 честно говоря, я не могу найти хорошую причину, по которой этот код не должен работать как есть

Ответ №1:

Я попытался скопировать и вставить ваш код, и у меня (null) тоже получилось.

Распечатав список всех HTTPHeaderFields ( [request allHTTPHeaderFields] ), я получил:

 Content-Type: {
    "ContentU00ad-Type" = "application/json";
}
 

Как вы видите, есть странный символ Юникода: U00ad .
Это причина, по которой, когда вы пытаетесь получить значение, связанное с Content-Type , оно находит null .

Итак, я попытался изменить строку @"Content-Type" в вашем коде, и результат был:

 Content-Type: {
    "Content-Type" = "application/json";
}
 

И действительно, теперь ведение журнала:

 NSLog(@"Content-Type: %@", [request valueForHTTPHeaderField:@"Content-Type"]);
 

Я получил:

 Content-Type: application/json
 

Комментарии:

1. Во-первых, спасибо за редактирование сообщения и внесение отступов в код. Во-вторых, разумное мышление для исправления ошибки. Я копировал поле заголовка Content-Type из файла PDF. Не заметил, и он вставлен в неправильной кодировке.

2. Избегайте «копировать» -> «вставить», когда можете 🙂