Как установить этот заголовок в php с помощью Curl? (Элемент CustomInfo – это массив (пары вложенных ключей), а элемент AuthenticationInfo – массив (пара вложенных ключей))
<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:
Когда я не сериализую $ headers, я получаю:
Примечание. Преобразование массива в строку
В идеале вы должны использовать 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
без упоминания: как я могу предотвратить SQL-инъекцию в PHP?