【问题标题】:How to set up cURL to retrieve data from other site(s)如何设置 cURL 以从其他站点检索数据
【发布时间】:2014-12-22 19:16:21
【问题描述】:

我在尝试设置 cURL 以从其他站点检索数据时卡住了

这是我的情况。

我有 2 个网站:

  • 一个

网站A将数据以json格式发送到网站B。 当然,网站A 必须在发送之前对所有数据进行编码 - 已经完成了。

让:

  • 用户名 = 测试
  • 密码 = 1234

网站B只需要运行这个命令

curl --user test:1234 http://localhost/api/

然后他们将获取 json 文件,并从中进行任何操作。


但是,如果我必须执行多个 cURL 请求怎么办。 所以我想写一个 php 脚本来做到这一点。 这是我到目前为止所拥有的:

<?php

$ch = curl_init("http://localhost/api/");
$fp = fopen("api.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

问题

  • 这样做时,我不确定如何配置usernamepassword
  • 知道usernamepassword在哪里设置之后,我应该在哪里解码json?
  • 之后,如何以 HTML/PHP 格式显示我刚刚解码的那些数据?
  • 如何测试它?

【问题讨论】:

    标签: php json rest curl


    【解决方案1】:

    设置用户名和密码

    网站 B 正在使用HTTP Basic Authentication。这是一种通过 HTTP 标头的身份验证方法。您必须在 Authorization 标头中设置用户名和密码。这可以使用 PHP 的 cUrl 模块来完成,如下所示:

    curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);

    解码你的结果

    假设您只需要网站 B 返回的 JSON 数据。使用以下选项。它将使curl_exec() 返回HTTP 正文,而不是直接输出。

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    有关可与 PHP curl 模块一起使用的选项列表,请查看 curl_setopt() 上的 the documentation。现在您可以使用 curl_exec() 向 cUrl 提出请求,如下所示:

    $body = curl_exec($ch);

    然后解码 JSON 数据,为简单起见,我们将其解码为 PHP 数组:

    $data = json_decode($body, true);

    测试您的代码

    在我看来,PHP 不是一种提供出色测试功能的语言。撇开这一点不谈,大多数时候我在交互式 shell 中测试我的代码。要开始在交互式 shell 中测试您的场景,您应该在系统上安装 PHP CLI。在 linux 中,这是直截了当的。使用以下命令启动交互式 PHP shell:

    php -a

    现在你可以开始组合你的场景了。

    php > $ch = curl_init('http://echo.jsontest.com/key/value/one/two');
    php > curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    php > $body = curl_exec($ch);
    php > var_dump($body);
    string(39) "{
       "one": "two",
       "key": "value"
    }
    "
    php > $data = json_decode($body, true);
    php > print_r($data);
    Array
    (
        [one] => two
        [key] => value
    )
    

    【讨论】:

    • 我也喜欢你的回答。我有几个问题。 1-$body = curl_exec($ch);curl_exec($ch); 之间的区别是什么,或者我们两者都需要。
    • 不,你只需要$body = curl_exec($ch);。当您使用curl_exec()时,cUrl 将向网站 B 发出请求,并将响应存储在变量 $body 中。基本上就像在浏览器中输入 url 并将您看到的页面存储在 $body 中。
    • 我注意到,你没有使用 $fp = fopen("distributor_api.txt", "w");curl_setopt($ch, CURLOPT_FILE, $fp);curl_setopt($ch, CURLOPT_HEADER, 0); 它们是可选的还是我不需要的额外的东西?
    • 您介意更新您的答案并添加最后一件事吗? whole file 最后应该是什么样子?我相信你的回答会让很多人受益。 HERE 是我最终文件的样子。如果我错了,请纠正我。
    • JSON 是一种数据格式。假设网站 B 返回的 JSON 是 {"one": "

      Hulk is green

      "}。现在按照我帖子中的示例,您可以使用 echo $data['one'] 回显 HTML。
    【解决方案2】:

    您可以像这样配置用户名和密码

    //cURL Options
    $options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERPWD => 'test:1234',  // username:test pass:1234
    CURLOPT_HTTPHEADER => array(‘Content-type: application/json’) ,
    CURLOPT_POSTFIELDS => $json_string
    );
    
    // Setting curl options like this
    curl_setopt_array( $ch, $options );
    
    // Getting results
    $result = curl_exec($ch); // Getting jSON result string
    

    你如何测试它? 我会将所有内容放在一个 .php 文件中,并在浏览器上调用它以进行调试以保持简单。

    【讨论】:

    • 我有点困惑,当你做$username . “:” . $password,时,你能编辑你的答案吗,用户名=test和密码=1234。而不是我喜欢你的回答。 +1 @unixmiah
    • 我注意到,你没有使用curl_setopt($ch, CURLOPT_FILE, $fp);,所以我的$fp = fopen("distributor_api.txt", "w"); 会发生什么。我需要吗? Here is the FINAL look of my file ...
    • 您可以使用 $fp = fopen("distributor_api.txt", "w") 文件和 $result = curl_exec($ch) 然后将内容写入文件 fwrite($fp, $结果)
    • 将内容写入文件?请问为什么我们需要这样做?如果您不介意,请看一下THIS,看看这是否是最终的样子?我没有包括 fwrite,因为我不知道为什么我们还需要它。谢谢
    猜你喜欢
    • 2015-02-17
    • 2015-02-21
    • 2015-02-18
    • 1970-01-01
    • 2014-04-16
    • 2012-07-16
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多