cURL добавляет пробелы к содержимому публикации?
Вопрос
Я пытаюсь ОПУБЛИКОВАТЬ на сервере поставщика, используя 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 с указанием:
Содержимое, не разрешенное в prolog
Я просмотрел эту ошибку, и обычно это вызвано пробелом перед 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.Это то, что вызывает проблему, и если да, то как я могу ее устранить, или я заглядываю слишком далеко, и это может быть проблема с сервером, на котором я размещаю публикацию?
Решение 2
Оказывается, это проблема с кодировкой.Приложению, по-видимому, нужен 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));
Другие советы
Это не ответ, но я нахожу всю эту штуку с 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() для проверки точных выходных данных (включая длину строки, чтобы вы могли искать недостающие элементы)
Надеюсь, это поможет
Я сделал wc -m test.xml
и вернулся с 743 символами в XML-файле и var_dump
вкл . $request
возвращается с 742 символами, так что что-то удаляется с помощью trim()
(Я предполагаю).
Я сделал:
print "=====" . $request . "=====";
и начало и конец XML-файла упираются прямо в ===== без пробелов.