Сведения о вопросе

LARVION

06:46, 29th August, 2020

Теги

php   xml   curl    

cURL добавление whitespace к контенту публикации?

Просмотров: 440   Ответов: 3

Я пытаюсь 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);

Этот код, сам по себе, работает OK, но другой сервер возвращает ответ от его парсера XML, заявляющего:

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

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



  Сведения об ответе

+-*/

05:24, 17th August, 2020

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

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


  Сведения об ответе

9090

07:00, 10th August, 2020

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

# 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));


  Сведения об ответе

dump

17:38, 27th August, 2020

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

Я сделал а:

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться