2016-09-02 35 views
2

如何在PHP中使用Curl設置此標頭? (CustomInfo元件陣列(嵌套密鑰值對)和AuthenticationInfo元件陣列(嵌套密鑰值對))PHP Curl HTTP POST REQUEST設置自定義標頭與嵌套鍵值對

<xml bla bla...> 
    <Header> 
    <CustomInfo> 
    <IsTestMessage>true</IsTestMessage> 
    <IsContentCompressed>false</IsContentCompressed> 
    </CustomInfo> 
    <AuthenticationInfo> 
    <ApplicationId>SomeId</ApplicationId> 
    <VersionId>0.9</VersionId> 
    <RelationId></RelationId> 
    <UserId>SomeUserId</UserId> 
    <Password>SomePassword</Password> 
    </AuthenticationInfo> 
    </Header> 
    <Body> 
    <!--etc...(actual xml)--> 
    </Body> 
    </xml bla bla...> 

通常我會做:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"http://www.example.com/process.php"); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$vars); //Body 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$headers = array(); 
$headers[] = 'key: value'; 
$headers[] = 'key2: value2';//and so on... 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

$server_output = curl_exec ($ch); 

curl_close ($ch); 

print $server_output ; 

但是這是怎麼做當標題包含嵌套的鍵值對?

編輯1:

使用這種方式時,但不工作(真正的牛逼,所以我必須這樣做是錯誤):

$headers = array(); 
      $headers[] = array('CustomInfo' => array(
           'IsTestMessage' => "true", 
           'IsContentCompressed' => "false") 
           ); 
      $headers[] = array('AuthenticationInfo' => array(
       'ApplicationId' => "SomeId", 
       'VersionId' => "0.9", 
       'RelationId' => "", 
       'UserId' => "SomeUserId", 
       'Password' => "SomePassword" 
       ) 
       ); 
      $headers = serialize($headers); 

      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

      var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT)); 

警告:curl_setopt():你必須通過任一對象或陣列與CURLOPT_HTTPHEADER參數

編輯2:

當我不序列化$頭,我得到:

注意:數組字符串轉換

回答

0

理想情況下,你應該使用CURLOPT_POSTFIELDS除非這是從外部API的特定需求

$myArray = array(); 
$myArray[] = array('key' => 'value'); 
$myArray[] = array('key2' => array('value2' => array('foo' => 'bar'))); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS,array('myVars' => $vars, 'myArray' => $myArray)); //Body 

然後訪問它$_POST['myArray']

警告:可以注入頭文件和POST變量,所以我也建議你對發件人進行檢查(例如$_SERVER['REMOTE_ADDR'] == 127.0.0.1),如果這些要求只是爲了來自你自己的服務器

我不能提及訪問$_POST不提的還有:How can I prevent SQL injection in PHP?

+0

THX的男人!要立即嘗試。 – Sake

+0

沒有工作(一定是做錯了) 看到我的編輯... – Sake

+0

這實際上是一個特定的要求,從外部的API,這些元素被放置在標題.. 公平......我正在嘗試做肥皂後請求。 但是我一直試圖做到這一點,而不使用PHP soapclient,但自己建立原始郵政(出於多種原因) 但是,爲了實現這一點,我需要建立自定義標題(如上所述) – Sake