如何使用XML格式的数据发出POST请求并获得结果

I have an API which says all requests are made as POST requests with data in XML format, and it gives me a sample XML data:

<?xml version="1.0" ?>
<Request>
    <SystemName>SomeSystemName</SystemName>
    <Client>SomeClientID</Client>
    <Method action="SomeAction">MethodParams</Method>
</Request>

Now I use curl to do it, like in this function:

function curl_post_xml($url, $xml, array $options = array()) 
{ 
    $defaults = array( 
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $xml,
        CURLOPT_HEADER => 0, 
        CURLOPT_URL => $url, 
        CURLOPT_FRESH_CONNECT => 1, 
        CURLOPT_RETURNTRANSFER => 1, 
        CURLOPT_FORBID_REUSE => 1, 
        CURLOPT_TIMEOUT => 4,
    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, ($options + $defaults)); 
    if( ! $result = curl_exec($ch)) 
    { 
        trigger_error(curl_error($ch)); 
    } 
    curl_close($ch); 
    return $result; 
} 

And in $xml I put that XML string from above. Am I doing it right? Because I heard that when using POST, the data must be in key-value format, but the API doesn't say anything about which variable should I assign XML string to.

Am I doing it right? Because I heard that when using POST, the data must be in key-value format,

Yes, you are right, you have to specify that you are sending an XML that's all.

CURLOPT_HTTPHEADER => array("Content-Type: application/xml"),
// or text/xml instead of application/xml

You do not need to put the $xml under a key. Just pass it as you are doing, its fine.

This works for me:

<?php 
    $xml_data ='<Request>
    <SystemName>SomeSystemName</SystemName>
    <Client>SomeClientID</Client>
    <Method action="SomeAction">MethodParams</Method>
</Request>';


$URL = "https://www.yourwebserver.com/path/";

            $ch = curl_init($URL);
            curl_setopt($ch, CURLOPT_MUTE, 1);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
            curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);
            curl_close($ch);


?>