PHP https публикует данные XML с помощью cURL - PullRequest
6 голосов
/ 02 декабря 2010

Я пытаюсь отправить запрос HTTPS POST с данными 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 Тип содержимого: text / xml; charset = UTF-8 Длина контента: 0 Дата: чт, 02 дек 2010 03:02:33 GMT

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

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

решаю с

$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 голосов
/ 02 декабря 2010

Вы должны сделать, в вашем оригинальном коде:

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 голосов
/ 02 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...