parse XML from post URL
- Login to post comments
Thu, 2007-11-08 18:39
สอบถามเรื่องการ parse xml จาก URL Post น่ะค่ะ
ปรกติเวลารับค่า xml file จาก url ก็จะใช้ฟังก์ชั่น xmlparse แล้วก็เอาค่า element แต่ละค่ามาใช้งานค่ะ ตัวอย่างเรียกใช้ class
$xmlFile = "http://domainname.com";
$ob = new classname($xmlFile);
...
หลังจากทำงาน ก็จะได้ค่าแต่ละ element มาใช้งานค่ะ..
แต่ตอนนี้ทำการเชื่อมกับ url นึง โดยเจ้าของ url นั้นแจ้งว่าจะส่งค่าแบบ post xml มาให้และทางเราก็ parse xml แต่พอทดลองทำแล้ว มัน Error แบบนี้ค่ะ
HTTP ERROR: 405
HTTP method GET is not supported by this URL
.. งงเลยค่ะว่า เกิดจากอะไร เข้าใจว่าต้อง รับค่าแบบ post แต่ไม่รู้จะรับยังไง ประกาศตรงไหนน่ะค่ะ .. รบกวนผู้รู้ให้ข้อมูลแด่ผู้น้อยด้วยนะคะ (- /|\ - ) ขอบคุณมากๆค๊า
>> แต่ตอนนี้ทำการเชื่อมกับ url นึง โดยเจ้าของ url นั้นแจ้งว่า
>> จะส่งค่าแบบ post xml มาให้และทางเราก็ parse xml
>> แต่พอทดลองทำแล้ว มัน Error แบบนี้ค่ะ
>>
>> HTTP ERROR: 405
>> HTTP method GET is not supported by this URL
ตอนส่ง request ไปหา url นี้ ทำยังงัยคับ เขียน php script ส่ง หรือ ส่งผ่าน html form ?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
ผมเข้าใจว่า คงมีไฟล์ xml อยู่ใน http://domainname.com
ลองเปลี่ยนไปใช้ cURL ดูครับ
ขอสอบถามเพิ่มเติมค่ะสำหรับการรับข้อมูล เช่นข้อมูล xml ซึ่งปกติจะถูกส่งมาด้วย POST
ตัว app เขียนแบบนี้ค่ะ
$urlWithProtocol = "http://ip:port/app";
$request = "";
$isRequestHeader = false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlWithProtocol);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HEADER, (($isRequestHeader) ? 1 : 0));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
print_r($response);
ซึ่งเมื่อรันแล้ว ไม่แสดงค่าอะไรเลยน่ะค่ะ เป็นหน้าจอว่างๆ..
สำหรับตัว $urlWithProtocol ลองใส่ 2 url ค่ะ urlนึงแสดงผล อีกตัวไม่แสดงผล เลยงงว่า เกิดจากอะไรค่ะ
ย้อนกลับมาอ่าน
"แต่ตอนนี้ทำการเชื่อมกับ url นึง โดยเจ้าของ url นั้นแจ้งว่าจะส่งค่าแบบ post xml มาให้และทางเราก็ parse xml"
แล้วก็ร้องอ๋อ Web services นี่นา
ตัวอย่างนี้น่าจะใช้ได้นะครับ แบบบ้าน ๆ ล่ะกัน ตัวรับผมใช้ Simple XML
ตัวส่ง
<?php
/**
* @author Audy amaudy [at] Gmail dot Com
* @copyright 2007
*/
// จะส่งไปที่ไหน
$ch = curl_init("http://xml.localhost/xml-rec.php");
// ข้อมูลที่จะส่งไป
$postData = "<?xml version='1.0' encoding='UTF-8'?><person><name>PHPZealots members</name></person>";
$httpHeaders = array("Content-Type" => "text/xml");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);
curl_setopt($ch, CURLOPT_POST, 1);
// ชื่อตัวแปรที่ส่งไปในตอนนี้คือ xmldata คิดซะว่ามันคือฟิลด์นึง
curl_setopt($ch, CURLOPT_POSTFIELDS, "xmldata=$postData");
curl_exec($ch);
//เผื่อมี Error ตั้งตัวแปรรับไว้ตรวจสอบ
$lastError = curl_error($ch);
echo "\nLast error : $lastError\n";
// ตังตัวแปรรับ แอบดูว่ามันคุยอะไรกัน
$lastReq = curl_getinfo($ch);
echo "\nLast request message : \n";
print_r($lastReq);
curl_close($ch);
?>
ตัวรับ
<?php
/**
* @author Audy amaudy [at] Gmail dot Com
* @copyright 2007
*/
// ตั้งตัวแปรรับ
$xmlData = $_POST['xmldata'];
// ตัดเครื่องหมาย \ ออก
$xmlData = stripslashes($xmlData);
$xml = new SimpleXMLElement($xmlData);
//print_r($xml);
$name = $xml->name;
$responceMessage = "Hello $name";
// ตอบกลับไป
echo $responceMessage;
?>
ผลลัพธ์
1. ต้องรู้ว่าเค้า POST มาในตัวแปรช์๋ออะไร
2. อย่าลืม Stripslashe ตัดเครื่องหมายพิเศษต่าง ๆ ออก
คิดว่าน่าจะใช่สิ่งที่ต้องการนะครับ
จากที่คุยกับ... เค้าไม่มีตัวแปรมาให้เลยค่ะ
แล้วเจนนี่ก็ลองรับค่า post แบบด้วนๆ ด้วย $HTTP_POST_VARS
ผลปรากฎว่า ไม่มีค่าใน $HTTP_POST_VARS .. T-T เศร้าจิตเลย
.....
ลองทำตัว post เองใน server เดียวกัน และก็ทำตัว รับค่า post เอง ด้วย $HTTP_POST_VARS ก็สามารถรับค่า post ได้
แต่พอเทสกับอีกเจ้าที่ต้องส่งค่าไปมาหากัน มันดันไม่มีค่าคะ งงเต๊กจิงๆว่าเกิดจากอะไร
...
T-T ผู้รู้ช่วยชี้แนะด้วยยย
อืมมม .... อ่านๆป อ่านมา ชักจะเริ่มงง ว่าใครเป็น client ใครเป็น server ... เจนนี่เป็น client หรือ server คับ จาได้แนะนำถูก ^_^
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
ลอง Dump ออกมาดูครับ รู้สึกมันจะมอง String ชุดแรกเป็นชื่อตัวแปร
จากตัวอย่าง ถ้า Post แบบไม่ใส่ชื่อตัวแปร เวลาดัมพ์ออกมา จะได้
<?xml version='1.0' encoding='UTF-8'?>
เป็นชื่อตัวแปรครับ
ต้องหาเครื่องมือมาดักตีหัว เอ้ย! ดักดูข้อมูลใน header ว่าส่งอะไรมาบ้าง
แหะๆๆ .. ต้องขอโทษเพ่โรตีด้วยคับที่ทำให้สับสน..
และขอบคุณ คุ๊ amaudy ที่มาช่วยไขปัญหานะกั๊บ..
-- ตอบเพ่โรตี .. เจนนี่ก็ง๊ง งง ว่าตกลงเราเป็น server หรือ client แต่เข้าใจว่าตัวเราเป็น Client มากก่า
แต่ตอนนี้ ความงงทุกประการได้จบลงแล้วค่ะ เจนนี่ใช้คำสั่ง $arr= @file_get_contents('php://input');
.. สรุปแล้ว เจนนี่น้อยเบาปัญญาไปเอง T-T ..
ขอบคุณท่านผู้รู้ที่มาช่วยเหลือนะค๊า (-/|\-)
ห้า ห้า ... จริงๆ ก็พอจับประเด็นได้ ว่าเจนนี่คงเป็นทั้ง server และ client คือ มีคน (เช่น mobile operator บางเจ้า) forward request ของ user มาให้ ซึ่งส่งมาเป็น xml แล้วเจนนี่ต้องรับ request มาแล้วก็เอามาโปรเซสต่อ ซึ่งตอนนี้เป็น server ซึ่งรับข้อมูลโดยใช้ $HTTP_RAW_POST_DATA หรือจาก php://input ที่เจนนี่ทำอยู่ก็โอเคแล้ว
จากนั้น หลังจากโปรเซสข้อมูลที่ได้มาแล้ว ก็ทำการส่ง request เพื่อทำงานตอบสนองให้แก่ request ข้างต้น ซึ่งขั้นตอนนี้จะเป็น client ทำได้โดยใช้ cURL ส่งข้อมูลก็จะสะดวกมาก
แล้วก็ตอน parse ข้อมูล xml แนะนำให้ใช้ DOMDocument Object สะดวกมากๆ :D
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...
ขอบคุณมากคั๊บ เพ่โรตี...