2015-04-09 3 views
15

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

Я обнаружил, что IOS посылает неправильное применение/х-WWW-форм-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, как '[запрос setHTTPMethod: @ "POST"]', в конце концов, длина запроса '[запрос SetValue: postLength forHTTPHeaderField: @ "Content-Length"]; 'и тип содержимого ' [request setValue: @ "application/x-www-form-urlencoded" forHTTPHeaderField: @ "Current-Type"]; ' –

+2

Он работал над созданием' Content- Введите заголовок '' application/json "'. Кажется, что я добавлял заголовки в 'NSURLSessionConfiguration' вместо' NSMutableURLRequest'. Спасибо !. –

+0

Я отвечу так, что мы сможем закрыть этот вопрос –

ответ

7

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

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

[request setHTTPMethod:@"POST"] 

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

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

и/или типа контента

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

Отлично. В некоторых реализациях это может быть быстрый способ сделать это: 'NSDictionary * headers = session.configuration.HTTPAdditionalHeaders;' для (id key в headers.allKeys) { '[request addValue: [headers objectForKey: key] forHTTPHeaderField : key]; ' } – Arjan

11

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

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

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

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

ОБНОВЛЕНИЕ: радар был установлен как «дубликат» другого, так что это скорее ошибка.

Как Лука отметил, работа вокруг, чтобы установить 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

+0

В документах также указано, что заголовки объекта запроса имеют приоритет над заголовками конфигурации. Здесь подразумевается, что 'NSMutableURLRequest' теперь устанавливает' Content-Type', когда он не использовался. –

+2

Только что получил это с выпуском iOS 8.3 - настройка Content-Type для каждого запроса url вместо использования 'NSURLSessionConfiguration' исправляет проблему –

+0

Спасибо за обходной путь. Это ужасная ошибка на платформе с многодневными таймфреймами обзора приложений. Интересно, сколько приложений было разбито на производство из-за этого. – StephenT

0

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

При отладке попытку отладки на стороне сервера также

Смежные вопросы