如何设置cURL以从其他站点检索数据

时间:2014-12-22 19:16:22

标签: php json rest curl

我在尝试设置cURL以从其他网站检索数据时遇到困难

这是我的情况。

我有2个网站:

  • A
  • B

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

让:

  • username = test
  • 密码= 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格式解码的数据?
  • 我该如何测试?

2 个答案:

答案 0 :(得分:0)

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

//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文件中并在浏览器上调用它来调试以保持简单。

答案 1 :(得分:0)

设置用户名和密码

网站B正在使用HTTP Basic Authentication。这是通过HTTP标头的身份验证方法。您必须在授权标头中设置用户名和密码。这可以通过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
)