Frage

Ich bin versucht zu POSTEN gegen einen Anbieter-server mit PHP 5.2 mit cURL.Ich lese in ein XML-Dokument zu veröffentlichen, die gegen Ihren server und dann das Lesen in einer Antwort:

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

Code, in einer von sich selbst hat, funktioniert OK, aber die anderen server gibt eine Antwort aus der XML-parser, die besagt:

Inhalt nicht erlaubt prolog

Ich sah, dass Fehler auf, und das ist normalerweise verursacht durch ein Leerzeichen, bevor der XML, aber ich stellte sicher, dass die XML-Datei selbst ist keine Leerzeichen und die trim() sollte klar, dass Sie auf jeden Fall.Ich habe ein TCPDump auf der Verbindung während ich lief, den code und das ist, was gesendet wird:

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--

Vor und nach dem [SNIP] - Linie es ist eine sichtbare Leerzeichen, wenn ich die Wiedergabe der Sitzung in Ethereal.Ist es das, was das problem verursacht, und wenn ja, wie kann ich ihn entfernen, oder ich bin auf der Suche zu weit, und dies kann ein Problem mit dem server bin ich Entsendung vor?

War es hilfreich?

Lösung 2

Es stellt sich heraus, es ist ein encoding-Problem.Die app braucht offensichtlich die XML im www-form-urlencoded anstelle von Formular-Daten, so dass ich hatte, zu ändern:

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

zu

# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));

Andere Tipps

Keine Antwort, aber ich finde die ganze fopen/fread/fclose Sache sehr langweilig zu Lesen, wenn man im code.

Sie können ersetzen:

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

Mit:

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

Trotzdem zu deiner Frage;wenn diese sind die Header gesendet werden, dann sollte es nicht sein, ein problem mit dem remote-server.Versuchen Sie, den Inhalt der xml-Datei und die Verwendung von var_dump (), um zu überprüfen die genaue Leistung (einschließlich die Länge der Zeichenfolge, so dass Sie Aussehen kann für fehlende Dinge)

Hoffe, das hilft

Ich habe eine wc -m test.xml und kam zurück mit 743 Zeichen in der XML-Datei und der var_dump auf $request kommt zurück mit 742-Zeichen, so etwas ist immer stripped trim() (Ich nehme an).

Ich habe ein:

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

und der Anfang und das Ende des XML-Hintern direkt vor die ===== keine Leerzeichen stehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top