parse XML from post URL

14 replies [Last post]
jennynoy
Joined: 2007-11-08
Points: 0
User offline. Last seen 2 years 29 weeks ago.

สอบถามเรื่องการ 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 แต่ไม่รู้จะรับยังไง ประกาศตรงไหนน่ะค่ะ .. รบกวนผู้รู้ให้ข้อมูลแด่ผู้น้อยด้วยนะคะ (- /|\ - ) ขอบคุณมากๆค๊า

roteee
roteee's picture
Joined: 2007-06-06
Points: 49
User offline. Last seen 22 hours 18 min ago.

>> แต่ตอนนี้ทำการเชื่อมกับ 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 ?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...

amaudy
Joined: 2007-09-24
Points: 0
User offline. Last seen 2 years 31 weeks ago.

ผมเข้าใจว่า คงมีไฟล์ xml อยู่ใน http://domainname.com

ลองเปลี่ยนไปใช้ cURL ดูครับ

jennynoy
Joined: 2007-11-08
Points: 0
User offline. Last seen 2 years 29 weeks ago.

ขอสอบถามเพิ่มเติมค่ะสำหรับการรับข้อมูล เช่นข้อมูล 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นึงแสดงผล อีกตัวไม่แสดงผล เลยงงว่า เกิดจากอะไรค่ะ

amaudy
Joined: 2007-09-24
Points: 0
User offline. Last seen 2 years 31 weeks ago.

ย้อนกลับมาอ่าน

"แต่ตอนนี้ทำการเชื่อมกับ 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 ตัดเครื่องหมายพิเศษต่าง ๆ ออก

คิดว่าน่าจะใช่สิ่งที่ต้องการนะครับ

jennynoy
Joined: 2007-11-08
Points: 0
User offline. Last seen 2 years 29 weeks ago.

จากที่คุยกับ... เค้าไม่มีตัวแปรมาให้เลยค่ะ

แล้วเจนนี่ก็ลองรับค่า post แบบด้วนๆ ด้วย  $HTTP_POST_VARS

ผลปรากฎว่า ไม่มีค่าใน $HTTP_POST_VARS .. T-T เศร้าจิตเลย

 

.....

ลองทำตัว post เองใน server เดียวกัน และก็ทำตัว รับค่า post เอง ด้วย $HTTP_POST_VARS ก็สามารถรับค่า post ได้

แต่พอเทสกับอีกเจ้าที่ต้องส่งค่าไปมาหากัน มันดันไม่มีค่าคะ งงเต๊กจิงๆว่าเกิดจากอะไร

...

T-T ผู้รู้ช่วยชี้แนะด้วยยย

roteee
roteee's picture
Joined: 2007-06-06
Points: 49
User offline. Last seen 22 hours 18 min ago.

อืมมม .... อ่านๆป อ่านมา ชักจะเริ่มงง ว่าใครเป็น client ใครเป็น server ... เจนนี่เป็น client หรือ server คับ จาได้แนะนำถูก ^_^

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...

amaudy
Joined: 2007-09-24
Points: 0
User offline. Last seen 2 years 31 weeks ago.

ลอง Dump ออกมาดูครับ รู้สึกมันจะมอง String ชุดแรกเป็นชื่อตัวแปร

จากตัวอย่าง ถ้า Post แบบไม่ใส่ชื่อตัวแปร เวลาดัมพ์ออกมา จะได้

<?xml version='1.0' encoding='UTF-8'?>

เป็นชื่อตัวแปรครับ

ต้องหาเครื่องมือมาดักตีหัว เอ้ย!  ดักดูข้อมูลใน header ว่าส่งอะไรมาบ้าง

jennynoy
Joined: 2007-11-08
Points: 0
User offline. Last seen 2 years 29 weeks ago.

แหะๆๆ .. ต้องขอโทษเพ่โรตีด้วยคับที่ทำให้สับสน..

และขอบคุณ คุ๊ amaudy ที่มาช่วยไขปัญหานะกั๊บ..

-- ตอบเพ่โรตี .. เจนนี่ก็ง๊ง งง ว่าตกลงเราเป็น server หรือ client แต่เข้าใจว่าตัวเราเป็น Client มากก่า

แต่ตอนนี้ ความงงทุกประการได้จบลงแล้วค่ะ เจนนี่ใช้คำสั่ง $arr= @file_get_contents('php://input');

 

.. สรุปแล้ว เจนนี่น้อยเบาปัญญาไปเอง T-T ..

 

ขอบคุณท่านผู้รู้ที่มาช่วยเหลือนะค๊า (-/|\-)

roteee
roteee's picture
Joined: 2007-06-06
Points: 49
User offline. Last seen 22 hours 18 min ago.

ห้า ห้า ... จริงๆ ก็พอจับประเด็นได้ ว่าเจนนี่คงเป็นทั้ง 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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
เซือในสิ่งที่เฮ็ด เฮ็ดในสิ่งที่เซือ...

jennynoy
Joined: 2007-11-08
Points: 0
User offline. Last seen 2 years 29 weeks ago.

ขอบคุณมากคั๊บ เพ่โรตี...



©2007-2010 PHPZealots.com. All right reserved.