2010-12-02 9 views
6

Я пытаюсь отправить запрос POST HTTPS с данными XML на сервер с использованием PHP.PHP https post XML-данные с cURL

Все, что отправляется на сервер, требует аутентификации, поэтому я буду использовать 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: текст/XML, кодировка = UTF-8 Content-Length: 0 Дата: Чт, 2 декабря 2010 03 : 02: 33 GMT

Я уверен, что тип файла верен, формат XML верен. Я пробовал urlencode поля, но это не сработало. Что еще я мог сделать неправильно?

ответ

0

Возможно, вы можете попробовать текст/xml вместо application/xml?

+0

пробовал, не работал ни – EDDIU 2010-12-02 04:12:51

0

Вы должны сделать, в вас исходный код:

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 непосредственно.

+0

просто попытался что, это не сработало. Он ответил тем же сообщением об ошибке. – EDDIU 2010-12-02 04:43:33

3

решаю с

$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); 
+0

В чем разница между curl_setopt ($ ch, CURLOPT_POST, 1); и curl_setopt ($ ch, CURLOPT_POST, true); Что это точно говорит CURL? – TimNguyenBSM 2015-03-31 16:30:26