cURL добавляет пробелы к содержимому публикации?

StackOverflow https://stackoverflow.com/questions/18166

  •  09-06-2019
  •  | 
  •  

Вопрос

Я пытаюсь ОПУБЛИКОВАТЬ на сервере поставщика, используя 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-файла упираются прямо в ===== без пробелов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top