Я пытаюсь отправить запрос POST HTTPS с данными XML на сервер с использованием PHP.
Все, что отправляется на сервер, требует проверки подлинности, поэтому я буду использовать cURL.
Некоторая справочная информация. Данные XML должны запрашивать у сервера загрузку файла с определенного URL-адреса в локальное хранилище.
Одно правило использования этого API – Я ДОЛЖЕН установить тип содержимого для каждого запроса в application / xml .
Это то, что я сделал, но не работает …
<?php $fields = array( 'data'=>'<n1:asset xmlns:n1="http://.....com/"><title>AAAA</title><fileName>http://192.168.11.30:8080/xxx.html</fileName><description>AAAA_desc</description><fileType>HTML</fileType></n1:asset>' ); $fields_string = ""; foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string,'&'); $url = "https://192.168.11.41:8443/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERPWD, "admin:12345678"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/xml', 'Content-length: '. strlen($fields_string)) ); $result = curl_exec( $ch ); curl_close($ch); echo $result; ?>
Я ожидаю, что XML-ответ удаленной загрузки или загрузки не будет выполнен. Но вместо этого я получаю это сообщение об ошибке.
HTTP / 1.1 415 Неподдерживаемый тип носителя: Apache-Coyote / 1.1 Content-Type: text / xml; charset = UTF-8 Content-Length: 0 Дата: Чт, 02 дек. 2010 03:02:33 GMT
Я уверен, что тип файла верен, формат XML верен. Я пробовал urlencode поля, но это не сработало. Что еще я мог сделать неправильно?
Я решаю с
$xml = $this->getXml(); $url = $this->getUrl(); $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, $xml); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/xml', 'Content-length: ' . strlen($xml) )); $output = curl_exec($ch); curl_close($ch);
Возможно, вы могли бы попробовать text / xml вместо application / xml?
Вы должны сделать в своем исходном коде:
curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields['data']);
или
curl_setopt($ch, CURLOPT_POSTFIELDS, '<n1:asset xmlns:n1="http://.....com/"><title>AAAA</title><fileName>http://192.168.11.30:8080/xxx.html</fileName><description>AAAA_desc</description><fileType>HTML</fileType></n1:asset>');
Я имею в виду, что вы должны отправить XML напрямую.