Тело 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) правильно не установлено внутри запроса.
При отладке попробуйте также отладить серверную часть