CURL добавить пробел для размещения контента? - PullRequest
4 голосов
/ 20 августа 2008

Я пытаюсь 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 есть видимые пробелы. Это является причиной проблемы и, если да, как я могу ее удалить, или я смотрю слишком далеко, и это может быть проблема с сервером, на котором я публикую сообщение?

Ответы [ 3 ]

3 голосов
/ 20 августа 2008

Не ответ, но я нахожу, что весь 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 (), чтобы проверить точный вывод (включая длину строки, чтобы вы могли искать пропущенные вещи)

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

2 голосов
/ 20 августа 2008

Оказывается, это проблема с кодировкой. Приложению, очевидно, нужен 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));
0 голосов
/ 20 августа 2008

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

Я сделал:

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

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

...