سؤال

أحاول النشر على خادم البائع باستخدام 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 نفسه لا يحتوي على مسافة بيضاء ويجب أن يقوم القطع () بمسح ذلك على أي حال.لقد قمت بإجراء 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 بدلاً من بيانات النموذج لذلك اضطررت إلى التغيير:

# 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/f Close ممل جدًا للاطلاع عليه عند النظر إلى الكود.

يمكنك استبدال:

$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