2

CURL を介して POST メソッドで XML を認証された Web サービスに送信しようとしていますが、何らかの理由でサーバーが XML ファイルを拒否しているため、エラー 500 が表示されますが、GET メソッド以外の別の Web サービスには問題ありません。次のコードは私が試しています。

  <?php
  $request_xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?> 
  <FiltroLicitaciones xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"> 
  <CantidadRegistro>10</CantidadRegistro> 
  <Texto>memo</Texto> 
  <CodigoRegion xsi:nil=\"true\" /> 
  <CodigoEstado>1</CodigoEstado> 
  <TipoFecha>FechaPublicacion</TipoFecha> 
  <FechaDesde>2011-06-01T00:00:00</FechaDesde> 
  <FechaHasta>2011-08-01T00:00:00</FechaHasta> 
  </FiltroLicitaciones>";

  //Initialize handle and set options 
  $username = 'user'; 
  $password = 'pass'; 
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, 'https://www.mercadopublico.cl/movil/licitaciones/porFecha');  
 //curl_setopt($ch, CURLOPT_URL, "http://localhost/server.php"); 
   curl_setopt($ch, CURLOPT_USERPWD, $username.':'.$password); 
   curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
   curl_setopt($ch, CURLOPT_HEADER, 1); 
   curl_setopt($ch, CURLOPT_TIMEOUT, 4); 
   curl_setopt($ch, CURLOPT_POSTFIELDS, $request_xml);

   $result = curl_exec($ch); 

   curl_close($ch); 

   print_r($result); 

   ?>

XML の不正な形式のエラーになるかどうかはわかりませんが、サーバーは次のヘッダーでランダムな 500 エラーを返します。

HTTP/1.1 500 The server encountered an error processing the request. Please see the      server logs for more details.
Cache-Control: private
Content-Length: 1047
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Jul 2012 23:53:05 GMT

私はローカルサーバーでテストを行いました.データが来ると、結果は次のようになります:

HTTP/1.1 200 OK 
Date: Mon, 30 Jul 2012 23:41:50 GMT 
Server: Apache/2.2.22 (Fedora) 
X-Powered-By: PHP/5.3.14 
Content-Length: 2450 
Connection: close 
Content-Type: text/html; charset=UTF-8 

Array 
( 
 [GLOBALS] => Array 
 *RECURSION* 
  [_POST] => Array 
    ( 
        [<?xml version] => "1.0" encoding="utf-8" ?> 
        <FiltroLicitaciones xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
        <CantidadRegistro>10</CantidadRegistro> 
        <Texto>memo</Texto> 
        <CodigoRegion xsi:nil="true" /> 
        <CodigoEstado>1</CodigoEstado> 
        <TipoFecha>FechaPublicacion</TipoFecha> 
        <FechaDesde>2011-06-01T00:00:00</FechaDesde> 
        <FechaHasta>2011-08-01T00:00:00</FechaHasta> 
        </FiltroLicitaciones> 
    ) 

[_GET] => Array 
    ( 
    ) 

[_COOKIE] => Array 
    ( 
    ) 

[_FILES] => Array 
    ( 
    ) 

[_ENV] => Array 
    ( 
    ) 

[_REQUEST] => Array 
    ( 
        [<?xml version] => "1.0" encoding="utf-8" ?> 
        <FiltroLicitaciones xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
        <CantidadRegistro>10</CantidadRegistro> 
        <Texto>memo</Texto> 
        <CodigoRegion xsi:nil="true" /> 
        <CodigoEstado>1</CodigoEstado> 
        <TipoFecha>FechaPublicacion</TipoFecha> 
        <FechaDesde>2011-06-01T00:00:00</FechaDesde> 
        <FechaHasta>2011-08-01T00:00:00</FechaHasta> 
        </FiltroLicitaciones> 
    ) 

[_SERVER] => Array 
    ( 
        [HTTP_HOST] => localhost 
        [HTTP_ACCEPT] => */* 
        [CONTENT_LENGTH] => 469 
        [CONTENT_TYPE] => application/x-www-form-urlencoded 
        [PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
        [SERVER_SIGNATURE] => <address>Apache/2.2.22 (Fedora) Server at localhost Port 80</address> 

        [SERVER_SOFTWARE] => Apache/2.2.22 (Fedora) 
        [SERVER_NAME] => localhost 
        [SERVER_ADDR] => ::1 
        [SERVER_PORT] => 80 
        [REMOTE_ADDR] => ::1 
        [DOCUMENT_ROOT] => /var/www/html 
        [SERVER_ADMIN] => root@localhost 
        [SCRIPT_FILENAME] => /var/www/html/server.php 
        [REMOTE_PORT] => 37712 
        [GATEWAY_INTERFACE] => CGI/1.1 
        [SERVER_PROTOCOL] => HTTP/1.1 
        [REQUEST_METHOD] => POST 
        [QUERY_STRING] =>  
        [REQUEST_URI] => /server.php 
        [SCRIPT_NAME] => /server.php 
        [PHP_SELF] => /server.php 
        [PHP_AUTH_USER] => user 
        [PHP_AUTH_PW] => pass 
        [REQUEST_TIME] => 1343691710 
    ) 

)

あなたが私を助けてくれることを願っています。

ありがとう。

よろしくお願いします。

4

3 に答える 3

0

サンプルダンプのこの部分に注意してください。

  [_POST] => Array 
    ( 
        [<?xml version]

XMLデータは、フィールド名が。のフォームタイプのデータアップロードとして解釈されました<?xml version。これにより、XMLの構造が破壊され、送信先のサーバーで解析エラーが発生しました。

于 2012-07-31T16:58:15.850 に答える
0

500エラーがxmlからのものかどうかはわかりませんが、コードでわかるように、xmlにはurl変数がありません。

  myxml=<xml></xml>

応答からわかるように、URLパラメンターは

 [<?xml version] => "1.0" encoding="utf-8" ?> 

そしてこれは間違っています。

APIドキュメントでURLパラメータが指定されていない場合は、おそらく正しいcurlヘッダーを設定する必要があります。

 curl_setopt($ch,CURLOPT_HTTPHEADER, Array("Content-Type: application/xml"); 

このように、サーバーは何を期待するかを知っています

于 2012-07-31T17:02:13.423 に答える
0

最初に以下のURLを読んでください。これはあなたにとって非常に役立つと思います

XML ファイルを Web サービスに送信する (cURL を使用)

http://softwaredevelopmentindia.wordpress.com/2007/07/09/sending-xml-files-to-a-webservice-using-curl/

またはこれを試してください

Web サービスの呼び出し。とても楽しい!!…それが機能するとき。最大の課題の 1 つは、XML ドキュメントを送信して応答を返すことです。特に XML ドキュメントの場合はそうです。必要なすべてのロジックをユーザーから隠し、XML ドキュメントの投稿を処理し、サーバーが応答するものは何でも返す PHP 関数を考え出しました。これは PHP の cURL ライブラリに依存しています (そのため、動作させるにはサーバー上で適切に構成する必要があります)。XML ドキュメントを作成し、XML ドキュメントを投稿する URL (およびポート) を選択するだけで、あとは関数が処理します。以下は機能コードです。ご覧のとおり、関数は SSL 対応サーバーを処理できます。これは、多くの Web サービスが HTTPS で実行されるため、大きな利点を提供します。

// http チャネルを開き、データを送信して受信バッファを返す

function xml_post($post_xml, $url, $port)
{
$user_agent = $_SERVER[’HTTP_USER_AGENT’];
$ch = curl_init(); // initialize curl handle
curl_setopt($ch, CURLOPT_URL, $url); // set url to post to
curl_setopt($ch, CURLOPT_FAILONERROR, 1); // Fail on errors
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
curl_setopt($ch, CURLOPT_PORT, $port); //Set the port number
curl_setopt($ch, CURLOPT_TIMEOUT, 15); // times out after 15s
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_xml); // add POST fields
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
if($port==443)
{
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
}
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

以下の例は、フォームの XML ドキュメントを投稿することによって、関数がどのように機能するかを示しています。

<?xml version=”1.0″ encoding=”iso-8859-1″?>

<Document> 

  <Message> 

     Your Name  

  </Message>

</Document>

これは、XML ドキュメントを取得して応答 (別の XML ドキュメント) を返します。この場合、リスナーは非常に単純です。「Message」タグを「Reply」に置き換えて、結果の XML を出力するだけです。もちろん、リスナーは POST に応答してあらゆる種類のことを行うことができます。

<?php 

   if ( !isset( $HTTP_RAW_POST_DATA ) )

   {

      $HTTP_RAW_POST_DATA = file_get_contents( ‘php://input’ ); 

   } 

   $xml = str_replace(”Message”,”Reply” , $HTTP_RAW_POST_DATA);  

   print((trim($xml)));

?>
于 2012-07-31T17:13:00.600 に答える