【问题标题】:Can't get data from API using PHP+cURL无法使用 PHP+cURL 从 API 获取数据
【发布时间】:2016-02-12 19:16:14
【问题描述】:

我正在尝试从网络服务here(植物分类数据库)获取一些数据。首先,我从客户端(Javascript/AJAX)尝试,但得到了cross-domain restriction。然后我切换到服务器端(PHP/cURL),但它不起作用,我的会话在请求期间中断。我遵循了here 的建议,但还是不行。

我在做什么:我通过 AJAX 调用一个文件,比如

getMOBOT.php?genus=Ocotea&sp=guianensis

getMOBOT.php 文件:

<?php
include_once '../../includes_pl/db_connect.php';
include_once '../../includes_pl/functions.php';
sec_session_start();
if (isset($_GET['genus'])) {
    $genus = $_GET['genus'];
    if (isset($_GET['sp'])) {
        $sp = $_GET['sp'];
        $curl = curl_init("http://services.tropicos.org/Name/Search?name=$genus+$sp&type=wildcard&apikey=[...]&format=xml");
        $curl_response = curl_exec($curl); // error!
        curl_close($curl);
        echo "It works!";
    }
}
?>

我读到我需要在 curl_exec 尝试(我的会话被丢弃的地方)之前关闭会话(session_write_close()),然后再重新打开它(session_start()),但是:

1) 我有一个用于安全会话的特殊函数,称为 sec_session_start()。无论我使用它,还是默认的 session_start()(在 curl_exec 之后),它们都不起作用。

2) 由于不需要在此文件中使用会话,因此我删除了两个 include_once 行以及 sec_session_start()。还是不行,我只是得到一个空白响应(HttpReq.readyState == 4, HttpReq.status != 200 and HttpReq.statusText == '')。

3) 如果我在浏览器中输入 URL,它可以工作,这意味着我的密钥是有效的(我不能在这里显示,它被 [...] 代替)。

编辑:将“curl_exec”行更改为:

if (!curl_exec($curl)) {
    die('Erro: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
} else {
    echo "It works!";
}

但仍然一无所获。请问我做错了什么?

编辑 2:我支持公司代理。也许这是(再次!)问题?

【问题讨论】:

    标签: php session curl asp.net-web-api


    【解决方案1】:

    是的,它是代理(再次)!

    我只需要添加

    $proxy = 'address:port';
    $proxyauth = 'user:password';
    curl_setopt($curl, CURLOPT_PROXY, $proxy);
    curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyauth);
    

    在正确的地方。

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 2019-08-15
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多