php - 使用 php 的 IP 地理位置 API 标头请求
问题描述
我正在尝试使用 ip-api.com (IP Geolocation) 来检索使用限制。
第一个 - 我已经设法将 api 与 php 一起使用,但他们没有在响应格式中给出使用限制(最多 45/分钟)。他们说该信息在 HTTP 标头中返回。
第二 - 所以我打开了 chrome 开发者网络,看看我是否找到了变量(X-R1 和 X-Ttl)或它们在 HTTP 标头中调用的任何内容,但我在那里看不到它们。
第 3 - 我设法做的是使用 php 函数 (get_headers($url)),它工作正常,但是当脚本运行时,它算作 2 个 API 请求,所以使用限制总是算作 2。
如何在第二步或使用一些 php 函数找到它们,这样我就不必像在第三步中那样发出另一个请求?
<?php
//1st request
function getClientIp(){
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
//ip from share internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
//ip pass from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$clientIp = getClientIp();
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$clientIp));
if ($query['status'] == 'success'){
echo $query['city'];
echo '<br>';
echo $query['query'];
};
//2nd Request
echo '<br><br>';
$url = 'http://ip-api.com/php/'.$clientIp;
//print_r(get_headers($url));
print_r(get_headers($url, 1)['X-Rl']);
解决方案
最后我的解决方案只是使用数组变量 $http_response_header。
像这样,我可以在单个请求中获取 API 响应 + 标头。
<?php
function getClientIp(){
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
//ip from share internet
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
//ip pass from proxy
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
function parseHeaders( $headers )
{
$head = array();
foreach( $headers as $k=>$v )
{
$t = explode( ':', $v, 2 );
if( isset( $t[1] ) )
$head[ trim($t[0]) ] = trim( $t[1] );
else
{
$head[] = $v;
if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$v, $out ) )
$head['reponse_code'] = intval($out[1]);
}
}
return $head['X-Rl'];
}
//body request
$clientIp = getClientIp();
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$clientIp));
if ($query['status'] == 'success'){
echo $query['city'];
echo '<br>';
echo $query['query'];
}
//header request
echo '<br>Available requests: '.parseHeaders($http_response_header);
推荐阅读
- sql - 仅在某些日志文件上的 SQL 查询语义错误
- python - 如何过滤该程序中的整数?
- c# - 如何避免不同用户使用相同的缓存数据?
- macos - readline() 在 Python 3.7 的串行行中无法正确读取字符串
- google-bigquery - BigQuery 仅在流缓冲区中显示值的第一个字母
- asp.net-core - 使用分页的 Asp.net Core OData 似乎无法找到如何获取总记录数
- meraki-api - Meraki - 无法获取设备列表
- node.js - Sequelize 返回错误的结果
- text - 我试图从 Double 中显示单个值
- javascript - 我是 javascript 新手,我想知道如何循环这两个代码