【问题标题】:How PHP get the content from web service?PHP 如何从 Web 服务中获取内容?
【发布时间】:2016-01-16 09:52:43
【问题描述】:

我在将内容/数组从 Web 服务获取到我的 php 代码时遇到问题。当我在浏览器中输入http://server1-xeon.asuscomm.com/currency/?amount=1.20,from=MYR,to=SGD 之类的url 时,浏览器中的结果显示如下:[ 1.20MYR , 0.39SGD ]。我的 PHP 代码如下所示:

$ch = curl_init('http://server1-xeon.asuscomm.com/currency/?amount=1.20,from=MYR,to=SGD');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);
echo $content;

不幸的是,我没有使用上面的代码。寻求帮助。 谢谢。

更新

 $data=array(
'amount'=>1.2,
'fromCurrency'=>'MYR',
'toCurrency'=>'SGD'
 );

 $data_string = json_encode($data);

 $ch = curl_init('http://server1-xeon.asuscomm.com/currency/WebService.asmx/YaHOO_CurrencyEx');

 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');                                                                     
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
 curl_setopt($ch, CURLOPT_HTTPHEADER, 
    array('Content-type: application/json'));                                                                                                       
$content= curl_exec($ch);
curl_close($ch);
$obj = json_decode($content);
echo $obj;

【问题讨论】:

  • 结果 [ 1.20MYR , 0.39SGD ] 不是正确的 JSON 字符串(需要引用这些值),并且 URL 将结果输出到 HTML 表中。不仅如此,看起来结果是由服务器上的 javascript 生成的,这意味着你永远不会通过 cURL 获得结果,因为 JS 不会运行。
  • 意味着 curl 只对获取 JSON 有效?

标签: php curl php-curl


【解决方案1】:

此页面包含由 JavaScript 加载的动态内容。例如,您可以通过访问view-source:http://server1-xeon.asuscomm.com/currency/?amount=1.20,from=MYR,to=SGD 在 Google Chrome 中查看它。

如果您仔细查看页面的源代码(文件http://server1-xeon.asuscomm.com/currency/JQuery/app_converter.js),您会发现它使用此代码在后台获取交换数据:

$.ajax({type: "POST",
        url: "WebService.asmx/YaHOO_CurrencyEx",  // important: it's a relative URL!
        data: "{amount:" + amount + ",fromCurrency:'" + from + "',toCurrency:'" + to + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        beforeSend: function () {},
        success: function (data) {
            $('#results').html(' [ ' + amount + from + ' , ' + data.d.toFixed(2) + to + ' ] ');
        });

所以,实际上你可以在 PHP 中发出这样的请求,以避免访问 http://server1-xeon.asuscomm.com/currency/?amount=1.20,from=MYR,to=SGD 页面上的动态内容。

统一更新: 我添加了更完整的解释。

http://server1-xeon.asuscomm.com/currency/?amount=1.20,from=MYR,to=SGD 上的页面被加载时,该页面上的JavaScript 代码(这意味着它在客户端、浏览器中而不是在您的服务器上执行)解析URL 参数并发出AJAX POST 请求到 URL http://server1-xeon.asuscomm.com/currency/WebService.asmx/YaHOO_CurrencyEx。它传递一个 JSON 有效负载 {amount:1.20,fromCurrency:'MYR',toCurrency:'SGD'} 并获得类似 {"d":0.390360} 的响应。因此,您可以直接通过curlhttp://server1-xeon.asuscomm.com/currency/WebService.asmx/YaHOO_CurrencyEx 发出POST 请求,在JSON 正文中传递amountfromCurrencytoCurrency,然后使用json_decode($content); 解码收到的JSON 响应。

【讨论】:

  • 对不起,因为我还是 php 新手,所以我不太明白....意味着我必须在我的 php 代码中添加两行,例如 $data=array('amount'=>1.2,'fromCurrency'=>'MYR','toCurrency'=>'SGD');curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type:application/json','Content-Length: ' . strlen($data)));
  • @JCChan,请看我的更新。此外,您不必手动指定 Content-Length 标头。
  • ,请看我的更新。我已经按照您的指示进行了更改,但仍然出现错误页面。不知道是什么问题。
  • @JCChan,您的代码看起来绝对没问题。只需将echo $obj 替换为var_dump($obj),因为PHP 无法将$obj 转换为字符串。
  • 我仍然得到错误页面,当我使用 Chrome 的检查元素进行检查并在我的标题中获得此 临时标题显示,因此状态为 失败 长时间加载后。
【解决方案2】:

数据应该是什么样子?从“UPDATED”将其添加到您的代码中并运行:

$array["MYR"] = 1.2;
$array["SGD"] = doubleval($obj->d)

// Print simple array (print source for example)
echo "<pre>";
print_r($array);
echo "</pre>";

// Print true JSON-array
print_r(json_encode($array));

在浏览器中你会看到:

Array
(
    [MYR] => 1.2
    [SGD] => 0.39036
)

{"MYR":1.2,"SGD":0.39036}

目前无法理解您的问题。

如果您只想打印返回值(数字),请执行此操作:echo $obj-&gt;d;

【讨论】:

  • 也感谢您的解决方案。这个echo $obj-&gt;d 有助于直接获取结果或值。
猜你喜欢
  • 1970-01-01
  • 2012-02-22
  • 2017-01-28
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多