PHP cURL - 链接标题

时间:2018-02-07 04:15:31

标签: php curl github-api

我已经创建了一个与GitHubs API交互的代码搜索应用程序,我想添加分页,分页数据保存在标题中,如下所示:

<html> <head> <style> body { margin: 0 auto; position: absolute; height: 100%; } .wrapper { width: 600px; margin-left: 20px; float: left; } .personal { float: left; background-color: rgba(29, 32, 44, 0.85); color: snow; width: 300px; height: 100%; } </style> </head> <body> <div class="personal"> content </div> <div class="wrapper"> content </div> </body> </html>

我的代码:

Link: <https://api.github.com/user/repos?page=3&per_page=100>; rel="next",
  <https://api.github.com/user/repos?page=50&per_page=100>; rel="last"

现在,我添加了 // API CONNECTION $url = 'https://api.github.com/search/code?q=' . $term . '+language:' . $lang . '&per_page=' . $pp; $cInit = curl_init(); curl_setopt($cInit, CURLOPT_URL, $url); curl_setopt($cInit, CURLOPT_RETURNTRANSFER, 1); // 1 = TRUE curl_setopt($cInit, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($cInit, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($cInit, CURLOPT_USERPWD, $user . ':' . $pwd); curl_setopt($cInit, CURLOPT_HTTPHEADER, array('Accept: application/vnd.github.v3.text-match+json')); // ADD THE HIGHLIGHTED CODE SECTION // MAKE CURL OUTPUT READABLE $output = curl_exec($cInit); $items = json_decode($output, true); curl_close($cInit); // CLOSE OUR API CONNECTION

现在,出于任何原因 - 当我curl_setopt($cInit, CURLOPT_HEADER, true);在我将var_dump($items)添加到我的代码之前工作时 - 而是返回CURLOPT_HEADER。这反过来打破了整个项目。

进行一些调试我发现NULL仍在输出数据,并且正如预期的那样包含了标题。但是,链接var_dump($output)如下所示:

Header当它不应该时。据我所知,看起来链接头实际上已经破坏了我的代码。

我尝试过各种各样的事情,例如在我解码之前尝试Link: ; rel="next", ; rel="last" urlencode,但无济于事。那么,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

设置curl_setopt($cInit, CURLOPT_HEADER, true);(或1代替true)意味着$output变量includes the headers不仅仅是让身体恢复正常。这就是为什么尝试json_decode()它不起作用 - 使用顶部的标题,它不再是有效的JSON字符串。

This SO question详细介绍了您可以尝试从您的身体中解析标头的各种方法,具体取决于您服务器的需求。如果您未使用代理,重定向或任何奇怪的内容,则该问题的the accepted answer可能适合您(适合您的变量):

$header_size = curl_getinfo($cInit, CURLINFO_HEADER_SIZE);
$header = substr($output, 0, $header_size);
$body = substr($output, $header_size);

如果您担心因为您正在与Github打交道并且您不了解他们的基础设施或他们可能会改变您的内容(Github search documentation确实警告它可能会发生变化毕竟没有预先通知),那么你可能最好使用CURLOPT_HEADERFUNCTION选项,它允许你分配一个回调函数来解析从cURL请求返回的每个(每个)头。它的价值必须是什么(来自the documentation):

  

接受两个参数的回调。第一个是cURL资源,第二个是带有要写入的头数据的字符串。标头数据必须由此回调写入。返回写入的字节数。

你可以在之前的同一个问题中看到这个例子 - 它可能是通常的琐碎案例(a named function, or a PHP callable array),甚至是closure which populates a global $headers array

测试了这些方法后,Link标题正确显示给我如果有多页结果。如果只有一个页面(或没有结果),则完全从Github响应中省略Link标题。

在不知道您为$term$lang$pp使用的内容的情况下,这可能会有点棘手。由于您还使用$user$pw组合进行授权,因此将常规API端点用于公共可销售数据可能会有一些差异。我会使用您知道的搜索查询来检查公共存储库中有多页结果。

最后但并非最不重要的一点是,如果你正在编写一个使用Github API的应用程序,我建议站在那些曾经去过那里的人的肩膀上。例如,KNP实验室有一个非常受欢迎的Github API wrapper for PHP(包含searchpagination的文档),或者如果您在那里使用Laravel,那么{{3} }}

答案 1 :(得分:0)

我在Shopify API中有相同的分页问题;标头一直工作到Link元素,该元素仅返回6个字符串(<https)。这两行代码对我有用(请注意,我在第二个代码上使用了htmlspecialchars(),以便可以在浏览器中使用var_dump($ header)查看它。

$header_size = curl_getinfo($cInit, CURLINFO_HEADER_SIZE);
$header = htmlspecialchars(substr($output, 0, $header_size));

答案 2 :(得分:-1)

  

但是,Link Header看起来像这样:

     

Link: ; rel="next", ; rel="last"

听起来您正在使用浏览器查看输出,它只是将<>之间的链接网址解释为文字。

使用var_dump代替echo进行调试。或者,简单地使用浏览器的源视图。