Ответ 1
Чем я ошибся?
Ничего.
Код состояния HTTP 411 (требуемая длина) отправляется сервером в качестве ответа, когда он отказывается принимать сообщение без заголовка длины содержимого по любой причине.
Сервер просто может принимать или не принимать контент без заголовка Content-Length.
Когда вы устанавливаете объект NSInputStream
в качестве тела запроса через свойство HTTPBodyStream
для запроса, NSURLConnection
больше не может оценивать длину самого тела. (для потока нет свойства length
). Следовательно, NSURLConnection
использует определенный "режим передачи", а именно "закодированное кодирование передачи". Этот режим передачи должен преуспеть для передачи любого тела, и ему не нужен заголовок Content-Legth (на самом деле он не должен содержать один). Увы, сервер просто не принимает этот тип передачи.
Смотрите также: Chunked transfer encoding (wiki).
Чтобы решить проблему на стороне клиента:
-
Определите длину тела самостоятельно (если возможно) и установите поле заголовка Content-Length для запроса. Если этот входной поток был создан из файла или из объекта
NSData
, длина может быть легко определена. Но не забудьте установить ту же длину, что и фактическое содержимое потока в байтах. -
Не используйте
NSInputStream
, но используйте объектNSData
как тело и установите его через свойствоHTTPBody
. Когда вы устанавливаете тело как объектNSData
,NSURLConnection
может самостоятельно определить длину содержимого, и он автоматически добавит заголовок Content-Length с правильной длиной, если вы не установите его самостоятельно в запросе.