จะโพสต์ XML ไปยังเซิร์ฟเวอร์ผ่านแบบฟอร์ม HTML ได้อย่างไร

ฉันต้องโพสต์ข้อมูลจากแบบฟอร์ม HTML ของฉันไปยังเซิร์ฟเวอร์ในรูปแบบ xml บางอย่างเช่น:

<some_parameters>
    <firstname>Homer</firstname>
    <lastname>Simpson</lastname>
    <street>74 Evergreen Tr.</street>
</some_parameters>

สิ่งที่ฉันรู้คือไปที่แอปพลิเคชัน CRM ตัวใดตัวหนึ่งที่ทำงานบนโดเมนอื่น ตอนนี้ฉันไม่แน่ใจว่าอะไรคือวิธีที่ดีที่สุดในการทำเช่นนี้

ฉันกำลังคิดที่จะรวมค่าของฟิลด์ในแบบฟอร์มของฉันเมื่อผู้ใช้ส่งแบบฟอร์ม ดังนั้นหากผู้ใช้พิมพ์ "Homer" ในช่อง "ชื่อ" และคลิกส่ง JS ของฉันจะเปลี่ยนค่าของช่องเป็น <firstname>Homer</firstname> แล้วโพสต์ข้อมูล

ถ้ามันช่วยได้ ฉันใช้ jQuery ในฝั่งไคลเอ็นต์ ฉันคิดว่าต้องมีวิธีที่ดีกว่านี้ เนื่องจากโซลูชันของฉันจะใช้งานไม่ได้หากปิดใช้งาน JS และดูเหมือนจะหลบเลี่ยงเล็กน้อย ดังนั้นหากคุณสามารถชี้ทิศทางที่ถูกต้องให้ฉันได้ก็จะดีมาก


person spirytus    schedule 18.01.2010    source แหล่งที่มา
comment
เพื่อให้ใครสักคนช่วยคุณได้ พวกเขาจะต้องรู้ว่าคุณใช้อะไรเป็นแบ็คเอนด์   -  person Scott Radcliff    schedule 18.01.2010


คำตอบ (5)


วิธีที่ดีที่สุดที่ฉันคิดได้คือการสกัดกั้นการดำเนินการส่งแบบฟอร์ม และแปลงรายละเอียดแบบฟอร์มเป็นรูปแบบ XML จากนั้นส่งสิ่งนั้นไปยังเซิร์ฟเวอร์ มีหลายวิธีในการทำเช่นนี้ แต่วิธีที่ง่ายที่สุดคือการใช้โซลูชันผ่านเฟรมเวิร์ก เช่น jQuery:

ตัวอย่างของสิ่งนี้สามารถพบได้ทางออนไลน์ที่ https://web.archive.org/web/20160305210731/http://www.docunext.com/blog/2009/01/convert-form-data-to-xml-with-jquery.html ซึ่งใช้ ปลั๊กอิน JSON เป็น XML:

$("#myform").submit(function(){
  var formjson = $('#myform').serializeArray();
  var formxml = json2xml(formjson);
  $.post("/collect.php", { 'data': formxml }, function(data){ 
    // callback logic
  });
  return false;
});
person Sampson    schedule 18.01.2010
comment
ลิงก์ทั้งสองนั้นตายแล้ว! - person thomaskonrad; 05.01.2017
comment
@thomaskonrad ฉันได้แก้ไขลิงก์แล้ว (โดยเปลี่ยนเส้นทางไปยังไฟล์เก็บถาวรทางย้อนกลับ) เป็นไปได้ว่าการดาวน์โหลดและทรัพยากรอื่นๆ บางส่วนอาจไม่ทำงาน แจ้งให้เราทราบหากคุณพบปัญหาใดๆ เพิ่มเติม - person Sampson; 07.01.2017

การโพสต์ XML โดยไม่มีจาวาสคริปต์หรือปลั๊กอินของเบราว์เซอร์เป็นไปไม่ได้ รูปแบบการโพสต์แบบฟอร์ม html ที่เป็นไปได้สองรูปแบบคือ application/x-www-form-urlencoded และ multipart/form-data

person Darin Dimitrov    schedule 18.01.2010
comment
คุณหมายถึง เป็นไปได้ แทนที่เป็นไปไม่ได้ใช่ไหม? - person MaxZoom; 11.12.2017

ฉันเพิ่งได้สิ่งนี้มาใช้งานใน Chrome สิ่งสำคัญคือการมีพื้นที่ว่างในชื่อพื้นที่ข้อความ:

<html>
    <body>
        <form action="http://target_webservice" method="post">
            <textarea rows="20" cols="100" name=" ">
                <?xml version="1.0"?><requestElements><blah></blah></requestElements>
            </textarea>
            <input type="submit" value="Submit">
        </form>        
    </body>
</html> 
person user2700463    schedule 20.08.2013
comment
ที่ยังคงโพสต์เป็น application/x-www-form-urlencoded - person Dave Sims; 01.06.2018

คุณสามารถส่ง XML โดยใช้ XFORMS ตัวอย่างเช่น โปรดดู: http://www.mozilla.org/projects/xforms/

person Pierre    schedule 18.01.2010
comment
+1 แต่เบราว์เซอร์ส่วนใหญ่ไม่รองรับสิ่งนี้ตามความรู้ที่ดีที่สุดของฉัน - person the_drow; 18.01.2010
comment
ล้าสมัยตั้งแต่ Gecko 19 (Firefox 19 / Thunderbird 19 / SeaMonkey 2.16) - person Nicholas TJ; 11.09.2013

หากโค้ดฝั่งเซิร์ฟเวอร์เป็นตัวเลือก คุณสามารถใช้สคริปต์ php CURL แบบกำหนดเองเป็นตัวกลางในการส่งต่อคำขอของคุณไปยังบุคคลที่สามในรูปแบบ xml จริง ฉันไม่แน่ใจว่า CURL มาพร้อมกับการติดตั้ง php มาตรฐานหรือไม่ และหากไม่มีตัวเลือก คุณอาจใช้ fsocketopen แทนได้ (แม้ว่าโดยส่วนตัวแล้วฉันคิดว่ากลยุทธ์นั้นยากกว่า) แต่ CURL นั้นติดตั้งง่ายและมีประโยชน์อย่างยิ่งในการอนุญาตให้ php ส่งคำขอราวกับว่าเป็นเบราว์เซอร์ ความแตกต่างที่คุณอาจสนใจในที่นี้คือ จริงๆ แล้วช่วยให้คุณสามารถตั้งค่าส่วนหัว 'ประเภทเนื้อหา: ข้อความ/xml' ได้

ดังนั้นให้แบบฟอร์ม html ของคุณส่งค่า GET หรือ POST ปกติไปยังสคริปต์ php ของคุณ จากนั้นให้สคริปต์ php ส่วนตัวแปลงเป็นรูปแบบ XML ที่บุคคลที่สามคาดหวัง (อย่าลืมนำหน้าด้วยแท็ก <?xml version="1.0" encoding="ISO-8859-1"?> พร้อมด้วยค่าแอตทริบิวต์ใดๆ ก็ตามที่เหมาะสมสำหรับคุณ) จากนั้นส่งออกไปผ่านโค้ดนี้:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-type: text/xml', 
    'Content-length: '.strlen($xmlRequest),
));
$output = curl_exec($ch);
curl_close($ch);
person kmuenkel    schedule 02.06.2015