我已经创建了一个与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
,但无济于事。那么,我该如何解决这个问题?
答案 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(包含search和pagination的文档),或者如果您在那里使用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
进行调试。或者,简单地使用浏览器的源视图。