CURL добавить пробел для размещения контента?

Я пытаюсь POST против сервера поставщика, используя PHP 5.2 с cURL. Я читаю в XML-документе, чтобы опубликовать на своем сервере, а затем читаю в ответ:

$request = trim(file_get_contents('test.xml'));
$curlHandle = curl_init($servletURL);
curl_setopt($curlHandle, CURLOPT_POST, TRUE);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curlHandle, CURLOPT_HEADER, FALSE);  # Have also tried leaving this out
$response = curl_exec($curlHandle);

Этот код сам по себе работает нормально, но другой сервер возвращает ответ от своего синтаксического анализатора XML:

Содержание не допускается в прологе

Я посмотрел на эту ошибку, и это обычно вызвано пробелами перед XML, но я убедился, что сам файл XML не имеет пробелов, и trim () должен все равно его устранить. Я сделал TCPDump для соединения, пока запускал код, и вот что отсылается:

POST {serverURL} HTTP/1.1
Host: {ip of server}:8080
Accept: */*
Content-Length: 921
Expect: 100-continue
Content-Type: multipart/form-data; boundry:---------------------------01e7cda3896f

---------------------------01e7cda3896f
Content-Disposition: form-data; name="XML"

[SNIP - the XML was displayed]

---------------------------01e7cda3896f--

До и после строки [SNIP] при воспроизведении сессии в Ethereal видны пробелы. Это является причиной проблемы и, если да, как я могу ее удалить, или я смотрю слишком далеко, и это может быть проблема с сервером, на котором я публикую сообщения?

20.08.2008 15:02:49
3 ОТВЕТА

Не ответ, но я нахожу, что весь fopen / fread / fclose очень скучен для просмотра при просмотре кода.

Вы можете заменить:

$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);

С:

$request = trim(file_get_contents('test.xml'));

Но в любом случае - на ваш вопрос; если это заголовки, которые отправляются, то это не должно быть проблемой с удаленным сервером. Попробуйте изменить содержимое вашего XML-файла и с помощью var_dump () проверить точный вывод (включая длину строки, чтобы вы могли искать пропущенные вещи)

надеюсь, это поможет

3
20.08.2008 15:22:50

Я сделал a wc -m test.xmlи вернулся с 743 символами в XML-файле, а var_dumpon $requestвозвращается с 742 символами, так что что-то теряется trim()(полагаю).

Я сделал:

print "=====" . $request . "=====";

и начало и конец XML встают прямо напротив ===== без пробелов.

0
15.01.2016 14:34:02
РЕШЕНИЕ

Оказывается, это проблема кодирования. Приложению, очевидно, нужен XML в www-form-urlencoded вместо form-data, поэтому мне пришлось изменить:

# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));

в

# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));
2
20.08.2008 16:11:31
просто убедитесь, что вы используете: curl_setopt ($ curlHandle, CURLOPT_HTTPHEADER, Array ("Content-Type: application / x-www-form-urlencoded; charset = utf-8"));
Alex Angelico 20.02.2013 01:40:05