使用 PHP cURL 通过 REST API 获取 JSON

Posted

技术标签:

【中文标题】使用 PHP cURL 通过 REST API 获取 JSON【英文标题】:Fetch JSON via REST API using PHP cURL 【发布时间】:2017-07-09 20:03:24 【问题描述】:

我想使用 php cURL 通过 REST API 检索 JSON 数据。

使用本文中的 PHP 代码,我能够绕过带有 URL 的 Spring Security 页面:

https://<host>/appserver/j_spring_security_check

但是,JSON 存在于这个 URL 中,我想获取它:

https://<host>/appserver/portal/api/1.0/apps

这是我用来自动登录的PHP代码,我尝试使用file_get_contents(url)但失败了,只有下面的代码可以确认登录。

<?php
function login()
    $headers[]      = "Accept: */*";
    $headers[]      = "Connection: Keep-Alive";
    $headers[]      = "Content-type: application/x-www-form-urlencoded;charset=UTF-8";
    $data           = "j_username=admin&j_password=demoserver";
    $data           = rtrim($data, "&");
    global $sessionid;
    $sessionid      = dirname(__FILE__).'/cookie2.txt'
    $ch                 = curl_init(); 
    $options = array(
        CURLOPT_REFERER             => "https://<host>/appserver/portal/login",
        CURLOPT_HTTPHEADER          => $headers,
        CURLOPT_COOKIEFILE          => $sessionid,
        CURLOPT_COOKIEJAR           => $sessionid,
        CURLOPT_URL                 => "https://<host>/appserver/j_spring_security_check",
        CURLOPT_SSL_VERIFYHOST      => 0,
        CURLOPT_SSL_VERIFYPEER      => false,
        CURLOPT_POST                => true,
        CURLOPT_POSTFIELDS          => $data,
        CURLOPT_HEADER              => true,
        CURLOPT_USERAGENT           => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0');
    curl_setopt_array($ch, $options);
    $content            = curl_exec($ch);
    curl_close($ch);

login();
$text = file_get_contents($sessionid);
preg_match('/\w32/u', $text, $match);
$jsession = implode($match);

    $headers1[]         = "Accept: */*";
    $headers1[]         = "Connection: Keep-Alive";
    $headers1[]         = "Content-type: application/json";
    $headers1[]         = "Cookie: JSESSIONID=".$jsession;
$url = 'https://<host>/appserver/portal/api/1.0/apps';
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers1);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $sessionid);
curl_setopt($ch2, CURLOPT_COOKIEJAR, $sessionid);
curl_setopt($ch2, CURLOPT_HTTPGET, 1);
$result = curl_exec($ch2);
curl_close($ch2);
// var_dump(json_decode($result, true));
$output = json_decode ( $result );

这是执行PHP代码后的结果:

HTTP/1.1 302 Found Date: Fri, 17 Feb 2017 03:59:00 GMT
Server: Apache/2.2.26 (Unix) mod_ssl/2.2.25 OpenSSL/1.0.1e mod_jk/1.2.37
Set-Cookie: JSESSIONID=DB7139F7B8EE30F868A8392A4BF15523; Path=/appserver/; HttpOnly
Location: https://192.168.100.100:444/appserver/portal/welcome 
Content-Length: 0
Access-Control-Allow-Origin: *
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain  

在给定上述 cURL 选项的情况下,我如何获取 JSON?

【问题讨论】:

当您说“结果”时,您的意思是这就是您从$result 检索到的结果? 是的,那是我代码中 $result 的输出。我刚刚从其他来源利用它.. 【参考方案1】:

既然已经使用了 cookiefile 和 cookiejar,为什么还要手动设置 cookie 标头?那不应该是必需的。

您收到一个 setcookie 标头也很可疑,可能服务器不接受您发送的会话 cookie。

另外,您为什么不在第二个请求中忽略无效 SSL?

最后,您为什么不在第二个请求中发送相同的用户代理?

我想如果你解决了这些问题,你会看到预期的行为。

【讨论】:

我不建议这样做,只是帮助排除故障。请注意,第一个请求有效,第二个无效。第一个是忽略 SSL,因此这就是我建议尝试这个的原因。在问题中,您可以读到他在 192.168.100.100 上运行它,恕我直言,它不太可能拥有有效的 SSL 证书。 经过几次调整后,我让它工作了。为了获取 JSESSIONID,您需要将 CURLOPT_COOKIESESSION 之类的设置为 true。并且由于旧的 jsessionid 保存在 cookie2.txt 中,所以我再次调用它作为引用站点的 id。 出于对社区的礼貌,请添加您的解决方案并接受它作为答案。谢谢。

以上是关于使用 PHP cURL 通过 REST API 获取 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP和cURL通过它们的API将文件上传到RapidShare

如何在php中使用CURL调用REST API?

在 PHP 中使用 curl 访问 REST API 时出现错误 401

PayPal REST API - 使用 PHP 和 curl 进入实时模式

PayPal Rest SDK API - 获取令牌

OAuth、PHP、Rest API 和 curl 给出 400 Bad Request