【问题标题】:PHP Post XML Request to server ( TNT Express Connect Pricing module)PHP Post XML 请求到服务器(TNT Express Connect 定价模块)
【发布时间】:2017-04-24 14:49:17
【问题描述】:

我尝试向 TNT Express 连接定价模块服务发出 http post 请求:

$xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'.PHP_EOL;
$xml .= '<PRICEREQUEST>'.PHP_EOL;
$xml .='<LOGIN>'.PHP_EOL;
$xml .= '<COMPANY>xxxxx</COMPANY>'.PHP_EOL;
$xml .= '<PASSWORD>xxxxx</PASSWORD>'.PHP_EOL;
$xml .= '<APPID></APPID>'.PHP_EOL;
$xml .= '</LOGIN>'.PHP_EOL;
$xml .= '<DATASETS>'.PHP_EOL;
$xml .='<COUNTRY>1.0</COUNTRY>'.PHP_EOL;
$xml .= '<CURRENCY>1.0</CURRENCY>'.PHP_EOL;
$xml .= '<POSTCODEMASK>1.0</POSTCODEMASK>'.PHP_EOL;
$xml .='<TOWNGROUP>1.0</TOWNGROUP>'.PHP_EOL;
$xml .='<SERVICE>1.0</SERVICE>'.PHP_EOL;
$xml .='<OPTION>1.0</OPTION>'.PHP_EOL;
$xml .='</DATASETS>'.PHP_EOL;
$xml .='<PRICECHECK>'.PHP_EOL;
$xml .='<RATEID>rate1</RATEID>'.PHP_EOL;
$xml .='<ORIGINCOUNTRY>GB</ORIGINCOUNTRY>'.PHP_EOL;
$xml .='<ORIGINTOWNNAME></ORIGINTOWNNAME>'.PHP_EOL;
$xml .='<ORIGINPOSTCODE></ORIGINPOSTCODE>'.PHP_EOL;
$xml .='<ORIGINTOWNGROUP></ORIGINTOWNGROUP>'.PHP_EOL;
$xml .='<DESTCOUNTRY>AU</DESTCOUNTRY>'.PHP_EOL;
$xml .='<DESTTOWNNAME></DESTTOWNNAME>'.PHP_EOL;
$xml .='<DESTPOSTCODE></DESTPOSTCODE>'.PHP_EOL;
$xml .='<DESTTOWNGROUP></DESTTOWNGROUP>'.PHP_EOL;
$xml .='<CONTYPE>D</CONTYPE>'.PHP_EOL;
$xml .='<CURRENCY>GBP</CURRENCY>'.PHP_EOL;
$xml .='<WEIGHT>0.2</WEIGHT>'.PHP_EOL;
$xml .= '<VOLUME>0</VOLUME>'.PHP_EOL;
$xml .= '<ITEMS>1</ITEMS>'.PHP_EOL;
$xml .='</PRICECHECK>'.PHP_EOL;
$xml .='</PRICEREQUEST>';

$url = 'iconnection.tnt.com';
$lenght = strlen($xml)+7;
$headers = array(
                "POST PriceGate.asp HTTP/1.0",
                "Accept:*/*",
                "User-Agent: PriceGate_socket/1.0",
                "Content-type: application/x-www-form-urlencoded",
                "Content-length: $lenght",
                );



$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_PORT, 81);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$result =  curl_exec($ch); 

 if (empty($result)) {
   // some kind of an error happened
    die(curl_error($ch));
      curl_close($ch); // close cURL handler
   } else {
      $info = curl_getinfo($ch);
      curl_close($ch); // close cURL handler

      if (empty($info['http_code'])) {
              die("No HTTP code was returned");
      } else {
//       

       // echo results
          echo "The server responded: \n";
          echo $info['http_code'];
      }
   }


   echo '<pre>';
   print_r ($result); 
   echo '</pre>';

但得到响应:无法连接到主机

我做错了什么? Mayby 还有其他解决方案来交互 tnt 服务或获取一些调试信息吗? 非常感谢

更新

现在的反应是:

The server responded: 405

HTTP/1.1 405 Method Not Allowed
Allow: OPTIONS, TRACE, GET, HEAD
Content-Length: 1564
Content-Type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 11 Sep 2013 10:12:01 GMT

更新 2

这是我的新 php 代码:http://pastebin.com/a4s4yLLu

现在我得到了回复:Fatal error: Curl failed with error #7: couldn't connect to host in /home/client/public_html/tnt/test3.php on line 104

【问题讨论】:

  • -> 无法连接到主机
  • 现在怎么办?查看我的更新
  • Now -> Method Not Allowed (405),这意味着(在这种情况下),你只能发送一个 OPTIONS, TRACE, GET , HEAD 但不是 POST 请求(就像你一样)。您可能应该找出该 Web 服务的文档在哪里。由于每个网络服务都是独立的,因此通常需要为您提供更好的建议如何继续。

标签: php xml post


【解决方案1】:

虽然这可能晚了 30 天.. 我实际上被分配了同一个项目.. x) 但我花了一些时间来修补它..

<?php
    /**
     *  Submit XML to the TNT
     *  server via a Stream instead
     *  of cURL. 
     *
     *  @Returns String (XML)
    **/
    function sendToTNTServer( $Xml ) {

    $postdata = http_build_query(
                       array(
                         //For Future reference
                         //the xml_in= ( the = ) is appended
                         //Automatically by PHP
                        'xml_in' => $Xml 
                       )
            );

    $opts = array('http' =>
                array(
                   'method'  => 'POST',
                   'header'  => 'Content-type: application/x-www-form-urlencoded',
                   'content' => $postdata
                 )
             );

    $context  = stream_context_create( $opts );
    $output = file_get_contents( 
           'https://express.tnt.com/expressconnect/pricing/getprice', 
           false, 
           $context 
         );

         return $output;
    }

    $XmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
                  <PRICEREQUEST> 
                       <LOGIN> 
                           <COMPANY>YOUR USERID</COMPANY> 
                           <PASSWORD>YOUR PASSWORD</PASSWORD> 
                           <APPID>PC</APPID> 
                       </LOGIN> 
                       <PRICECHECK> 
                           <RATEID>rate1</RATEID> 
                           <ORIGINCOUNTRY>GB</ORIGINCOUNTRY> 
                           <ORIGINTOWNNAME>Atherstone</ORIGINTOWNNAME> 
                           <ORIGINPOSTCODE>CV9 2RY</ORIGINPOSTCODE> 
                           <ORIGINTOWNGROUP/> 
                           <DESTCOUNTRY>ES</DESTCOUNTRY> 
                           <DESTTOWNNAME>Alicante</DESTTOWNNAME> 
                           <DESTPOSTCODE>03006</DESTPOSTCODE> 
                           <DESTTOWNGROUP/> 
                           <CONTYPE>N</CONTYPE> 
                           <CURRENCY>GBP</CURRENCY> 
                           <WEIGHT>0.2</WEIGHT> 
                           <VOLUME>0.1</VOLUME> 
                           <ACCOUNT/> 
                           <ITEMS>1</ITEMS> 
                     </PRICECHECK> 
                </PRICEREQUEST>";

    $returnXml = sendToTNTServer( $XmlString );
    echo $returnXml;
?>

【讨论】:

  • 早上好,我愿意!我将不得不尽快更改整个答案 =)
  • @KārlisMillers 试试上面的方法。我知道这很不一样 =)
  • 天哪!你做到了 :) 得到响应:UTDUTDUTDUTDUTDP13RATEID: rate1 - Standard Ratesrate115NExpressNONEGBP239.56Yrate115NExpressPriorityGBP264.56Yrate148NEconomy ExpressNONEGBP112.42Y
  • 太棒了 ;) 我不得不说,昨天我决定重新开始,因为 cURL 一直有这么 许多 问题,直到今天我仍然不知道为什么。我原来的代码实际上没有发布,它仍然在获取,因为我没有CURL_SETOPT( POST, 1 )。它检索了我不需要的信息。我发现了几个关于stream_context_create() 的cmets,它们似乎与TNT 一起工作得很好,而且我没有意识到添加xml_in=(与=)实际上被读作:xml_in== AND!是不是很讽刺?我们甚至不需要设置任何内容长度或自定义标题...... TNT!
  • @mike_x_ ExpressConnect 系统通常取决于 Town 字段不为空,遗憾的是!对于内部数据库查询,它可能是仅次于邮政编码的第二重要字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多