Тело NSMutableURLRequest отклонено после обновления iOS 8.3

До сегодняшнего обновления iOS 8.3 у меня был правильный код, но после обновления сервер начал отклонять запросы, так как он не смог найти данные JSON.

Я обнаружил, что iOS отправляет неправильный текст приложения /x -www-form-urlencoded (неправильно закодированный, поскольку он кажется JSON-объектом):

Wireshark screenshot showing wrong data

Это то, что я ожидал отправить (и что было отправлено в 8.2): Wireshark screenshot showing expected object

Как я уже сказал, это происходит только на iOS 8.3 (я просто пробовал на iOS-симуляторе с 8.2 и работает).

Я думаю, что проблема заключается в одном из классов, которые появляются в этих строках:

NSData *bodyData = [NSJSONSerialization dataWithJSONObject:requestDict options:0 error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = bodyData;

Я проверил документацию Apple, и в последнее время ничего не изменилось.

Кто-то страдает или знает, что может привести к этому?

Спасибо.

Ответы

Ответ 1

Я поставил комментарий как ответ здесь:

Попробуйте указать метод http, например

[request setHTTPMethod:@"POST"]

и/или длина запроса

[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

и/или тип содержимого

[request setValue:@"application/<YOUR CONTENT TYPE>"forHTTPHeaderField:@"Content-Type"];

Ответ 2

Я также столкнулся с этой проблемой в одном приложении.

Похоже, что это может быть ошибка, введенная в iOS 8.3. Из официального справочника Framework сказано о свойстве NSURLSessionConfiguration HTTPAdditionalHeaders:

Это свойство указывает дополнительные заголовки, которые добавляются ко всем задачам в сеансах на основе этой конфигурации. Например, вы можете установить заголовок User-Agent, чтобы он автоматически включался в каждый запрос, который ваше приложение выполняет через сеансы на основе этой конфигурации.

Из того, что я понимаю, набор Content-Type, установленный в этой конфигурации, должен автоматически включаться в каждый запрос, сделанный с помощью этого сеанса, что больше не относится к случаю с 8.3. Я подал радар.

UPDATE: радар был установлен как "дубликат" другого, так что скорее это ошибка.

Как отметил Лука, работа заключается в том, чтобы установить Content-Type непосредственно в запросе:

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

Источник: https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSURLSessionConfiguration_class/#//apple_ref/occ/instp/NSURLSessionConfiguration/HTTPAdditionalHeaders

Ответ 3

Кажется, что iOS 8.3 представляет это. На моем сайте мы обнаружили проблему, что тело (json) правильно не установлено внутри запроса.

При отладке попробуйте также отладить серверную часть