【问题标题】:How to read XML response from another site after submission of a html form提交 html 表单后如何从另一个站点读取 XML 响应
【发布时间】:2012-12-20 12:28:04
【问题描述】:

在我的网站中,我正在向支付网站 (webmasterchecks.com) 提交一个 html 表单,该网站通过 XML 响应响应我。正常表单提交后(通过单击提交按钮),XML 响应显示在外部链接 (https://api.webmasterchecks.com/payments/add) 上。我想阅读 XML 响应并更新我的数据库。我的编码语言是 PHP。

HTML 表单:

<form name="payment_form" action="https://api.webmasterchecks.com/payments/add" method="post">

<input type="text" name="client_id" value="****"></input>
<input type="text" name="akey" value="**********"></input>
<input type="text" name="method_id" value="2"></input>
<input type="text" name="payee" value="ABCD EFGH"></input>
<input type="text" name="amount" value="1.00"></input>
<input type="text" name="postage_id" value="6"></input>
<input type="text" name="reference" value="Payment"></input>
<input type="text" name="street_addr" value="51 ABCD"></input>
<input type="text" name="city" value="XYZ"></input>
<input type="text" name="state" value="NJ"></input>
<input type="text" name="country" value="United States"></input>
<input type="text" name="zip" value="01544"></input>
<input type="submit" name="submit" value="submit"></input>
</form>

我尝试使用 jquery post 提交表单并获取 json 数据。但是表单没有提交(控制台也没有出现任何错误)。代码如下。

$(function(){
      $("form[name=payment_form]").submit(function(){
        $.post($(this).attr("action"), $(this).serialize(), function(jsonData){
            alert(jsonData);
        }, "json");
        return false;
      });
    });

我也尝试使用 curl,但没有成功。它显示 API 密钥是无效的,因为使用上面的 html 表单,我得到了响应。 CURL 代码如下。

   $client_id = "****";
   $api_key = "*****************************";

   $output_url = "https://api.webmasterchecks.com/payments/add";

   $output_transaction  = "client_id=$client_id&";
   $output_transaction .= "akey=$api_key&";
   $output_transaction .= "method_id=2&";
   $output_transaction .= "payee=ABCD EFGH&";
   $output_transaction .= "amount=1.00&";
   $output_transaction .= "postage_id=6&";
   $output_transaction .= "reference=Payment&";
   $output_transaction .= "street_addr=FGHFHGFG&";
   $output_transaction .= "city=JHGJHG&";
   $output_transaction .= "state=NJ&";
   $output_transaction .= "country=United States&";
   $output_transaction .= "zip=54545454";

    ob_start();
    $ch = curl_init ($output_url); 
    curl_setopt ($ch, CURLOPT_VERBOSE, 1);
    curl_setopt ($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $output_transaction);
    curl_exec ($ch);
    curl_close ($ch);
    $process_result = ob_get_contents();
    ob_end_clean();

如何使用 XML 响应更新我的数据库?

提前致谢。

编辑

我的 api 密钥包含几个加号“+”。 API 密钥的示例格式如下。

q5Un5ObLZs2ovY2COW+LvHzEVdUy0kR3u6dPwh/p+wzlbh80vONBbo+otLpBwPqnvP/VjhglfFos51sLFDpUHi+6GnVbLtR3ATjSz9trGoKLFgrK/ostPUG4t9XV1EdS10JzVNZFscIxUuDpUHi+6GnVbLtR3ATjSz9trGoKLFgrK/ostPUG4t9XV1EdS10JzVNZFscIxUu2LVp>

【问题讨论】:

  • 在我看来,您设置了错误的 form:action 值,并尝试将 ajaxsubmit 提交到远程服务器(不允许的)而不是查询您的 php curl 脚本
  • 您的问题是向 API 发送请求还是从 API 解析 XML 响应?
  • @ricabral:使用普通表单提交(通过单击提交按钮),我如何解析来自其他网站的 XML 响应?我正在尝试这样做。
  • @Vprimachenko:表单动作正确。
  • @Debashis 但它会因为Same origin policy而失败

标签: php jquery curl


【解决方案1】:

您需要在此处将数据发送到本地脚本,然后将其打包成 curl 请求,以通过其 API 与远程服务器进行交互。

<form name="payment_form" action="local_script.php" method="post">
<input type="text" name="method_id" value="2"></input>
<input type="text" name="payee" value="ABCD EFGH"></input>
<input type="text" name="amount" value="1.00"></input>
<input type="text" name="postage_id" value="6"></input>
<input type="text" name="reference" value="Payment"></input>
<input type="text" name="street_addr" value="51 ABCD"></input>
<input type="text" name="city" value="XYZ"></input>
<input type="text" name="state" value="NJ"></input>
<input type="text" name="country" value="United States"></input>
<input type="text" name="zip" value="01544"></input>
<input type="submit" name="submit" value="submit"></input>
</form>

请注意,我已从表单中删除了 client_id 和 api_key,因为它们不应该像这样向公众展示

local_script.php

$api_url = "https://api.webmasterchecks.com/payments/add";
 $client_id = "****";
   $api_key = "*****************************";

$_POST['client_id'] = $client_id;
$_POST['akey'] = $api_key;

      $post_data = http_build_query($_POST);

    $xml = new DOMDocument();
    $ch = curl_init ($api_url); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//return xml
    curl_setopt($ch, CURLOPT_HEADER, FALSE);//we only need the body
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    $xml->loadXML(curl_exec($ch));
    curl_close ($ch);
    //for testing echo xml
    echo $xml->saveXML();
    //you need now to parse the xml before adding info to db
    $name = $xml->getElementsByTagName('name')->item(1)->nodeValue;
    $email = $xml->getElementsByTagName('email')->item(1)->nodeValue;

这就是我的做法,因为我精通 DOMDocument 来解析和编写 xml,您可以使用 DOMDocument http://www.php.net/manual/en/class.domdocument.php 的手册进行解析,也可以使用 SIMPLEXML http://php.net/manual/en/book.simplexml.php 任何一种方式,您需要将 xml 解析为将数据添加到您的数据库中。

【讨论】:

  • 我对上面的代码感到困惑。使用 HTML 表单,您将所有请求发送到 local_script.php 文件。那么,为什么要使用变量“$output_transaction”收集值并使用 curl 发送?请注意,我在使用 curl 方法时遇到了 API 密钥错误。如果我在 HTML 表单中使用相同的 API 密钥,则表单提交成功。
  • 你是对的,这是我的失误,因为我认为这就是你的输出交易。我现在使用 http_build_query 获取 $_POST 并将其放回 curl。我还将 api 密钥和客户端 ID 添加到 post 数组并通过数据。 http_build_query 应该正确编码并且应该可以工作
【解决方案2】:

您可能还可以使用 ajax 向该 URL 发送数据或从该 URL 获取数据。 我创建了显示地图和标记数据的简单页面。我已取 使用ajax的数据。对我的 ajax 调用的响应是 xml。所以之后 得到响应,我只是解析了 xml。

例如

var url="mapData.php"; var request = getRequestObj(); request.open("GET", url, true); request.onreadystatechange = function() { 如果(request.readyState == 4){ var xmlDoc = request.responseXML; // 获取标记数组并循环遍历它 var 标记 = xmlDoc.documentElement.getElementsByTagName("marker"); for (var i = 0; i

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多