首页 > 解决方案 > 使用 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']);

标签: php

解决方案


最后我的解决方案只是使用数组变量 $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);    

推荐阅读