PHP 如果获取接口的值和response headers内容

2023-10-26

  1. 通过file_get_contents获取接口信息
    /**
     * 获取接口内容及相应headers详情
     * @param string $url 需要请求的url
     * @return array 
     */
    public function getApiContents($url)
    {
        $content = file_get_contents($url);
        // 如果想设置头信息或非GET请求等
        $opts = array(
            'http' => array(
                'method'  => 'POST', // 请求方式
                'header'  => "Content-Type: text/xml\r\n"."Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n", // 请求头内容
                'content' => $body, // 传递的内容
                'timeout' => 60
             )
        );

        // 创建并返回一个资源流上下文,该资源流中包含了 options 中提前设定的所有参数的值。              
        $context  = stream_context_create($opts);
        $content = file_get_contents($url, false, $context, -1, 40000); // 后俩参数是设定截取字符串部分

        $responseInfo = $http_response_header;
        // $responseInfo 输出结果
        //Array
        //(
        //    [0] => HTTP/1.1 200 OK
        //    [1] => Server: ASP.NET Development Server/11.0.0.0
        //    [2] => Date: Fri, 11 Aug 2017 09:07:16 GMT
        //    [3] => X-AspNet-Version: 4.0.30319
        //    [4] => token: WaseLE/13V+xGjiHLorGQqGy3KfOJ
        //    [5] => Cache-Control: no-cache
        //    [6] => Pragma: no-cache
        //    [7] => Expires: -1
        //    [8] => Content-Length: 0
        //    [9] => Connection: Close
        //)

        // 转换成键值对格式,方便使用
        $responseArray = [];
        foreach ($responseInfo as $response)
        {
            $list = explode(":", $response);
            $responseArray[$list[0]] = $list[1];
        }

        $result = array($content, $responseArray);

        return $result;
    }

2.通过Curl方式

    /**
     * 获取接口内容及相应headers详情
     * @param string $url 请求的API地址
     * @param array  $post POST所需提交的数据
     * @param string $token 验证的TOKEN,放header里
     * @param bool   $returnHeader 是否需要查看response header内容
     * @return array
     */
    public function getApiContents($url, $post = array(), $token = '', $returnHeader = false)
    {
        // 初始化 cURL 会话
        $curl = curl_init();

        // curl_setopt — 设置 cURL 传输选项
        curl_setopt($curl, CURLOPT_URL, $url); // 需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。

        //curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');// 在HTTP请求中包含一个"User-Agent: "头的字符串。我觉得没啥用就注释了。付个链接供大家了解下User-Agent [用户代理-百度百科](https://baike.baidu.com/item/%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86/1471005?fr=aladdin&fromid=10574244&fromtitle=user-agent)

        //  CURLOPT_FOLLOWLOCATION TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。(注意:这是递归的,"Location: " 发送几次就重定向几次,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数。)。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 

        //  TRUE 时将根据 Location: 重定向时,自动设置 header 中的Referer:信息。
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);

        //在HTTP请求头中"Referer: "的内容。
        //curl_setopt($curl, CURLOPT_REFERER, "http://XXX");

        // 如果有数据需要存 改 一般使用POST,所以通过这种方式判断是否是POST传输
        if(count($post) > 0) {
            //  CURLOPT_POST TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。
            curl_setopt($curl, CURLOPT_POST, 1); 

            // 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。由于这个影响了接收,我把数组转了下,http_build_query:生成 URL-encode 之后的请求字符串
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
        }

        // 我的API请求规则是,已登录会在response header里返回个token,在其他请求的时候需要带上这个token
        if(!empty($token)) {
            $header = ['token: '.$token]; //设置一个你的浏览器的header
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        }

        /* 如果不设置这个则无法获取response header内容 */
        curl_setopt($curl, CURLOPT_HEADER, $returnHeader);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 执行 cURL 会话
        $data = curl_exec($curl);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if (curl_errno($curl)) {
            return curl_error($curl);
        }
        // 关闭 cURL 会话
        curl_close($curl);


        $info['code'] = $httpCode;
        if($returnHeader){
            list($header, $body) = explode("\r\n\r\n", $data, 2);
            /* 本来只打算要取个token的,后来觉得还是把所有的都接收下好一点,也许后来会有新的需要呢 */
            //preg_match("/token\:(.*?)\n/", $header, $matches);
            //$info['token']  = trim($matches[1]);

            $headers = explode("\r\n", $header);
            $headList = array();
            foreach ($headers as $head) {
                $value = explode(':', $head);
                $headList[$value[0]] = $value[1];
            }

            $info['header'] = $headList;
            $info['content'] = $body;
        }else{
            $info['content'] = $data;
        }

        return $info;
    }

如果需要看其他 cURL 传输选项:PHP: curl_setopt - Manual

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 如果获取接口的值和response headers内容 的相关文章

  • 如何使用我的服务器作为代理通过 PHP 下载文件?

    我需要我的服务器充当第三方服务器 文件最初所在的位置 和最终用户之间的代理 也就是说 我的服务器从第3方服务器下载文件 然后用户从我的服务器下载它 这将导致产生文件大小两倍的带宽 这个过程如何使用PHP来实现呢 fp fopen url r
  • 如何将 UTC 日期时间转换为另一个时区?

    我怎样才能转换这样的日期 2012 07 16 01 00 00 00 它在UTC 00 00时区 到UTC 04 00时区 确保正确处理夏令时 Use DateTime http php net manual en class datet
  • “未定义变量”通知

    我对 php 很陌生 所以我确信这是一个简单的过程 我收到这个错误 Notice Undefined variable conn in C Dev Webserver Apache2 2 htdocs EclipsePHP thecock
  • Laravel 5:先发送响应,然后在控制器中处理请求

    我正在使用 Classic Paypal API 但在处理请求数据之前遇到了响应问题 public function store Send an empty HTTP 200 OK response to acknowledge recei
  • php 中的 PDOException“找不到驱动程序”

    我已经在 Linux 系统上安装了 Lampp 并且正在学习 symfony2 同时尝试使用 symfony2 命令创建架构 php app console doctrine schema create 我收到以下错误消息 PDOExcep
  • move_uploaded_file() 无法打开流

    我正在尝试通过 POST 通过 Pycurl 上传文件 在接收端使用 PHP 脚本 由于某种原因 PHP 部分似乎会导致错误 我将其精简为两个简短的测试脚本 import pycurl UPLOADURL http 127 0 0 1 ne
  • php 解码 JSON 获取值

    我正在尝试解码 JSON 格式 我要发送的是 id 123 name John surname Smith department 3 我正在通过 Postman 发送带有数据的 POST 如图所示 所以 这是我想要解码的数据 data se
  • 即使 return as float 设置为 true,PHP 函数 microtime 也可以返回整数吗?

    前几天 我网站的一位用户报告了一个错误 所以我查看了日志并找到了它 错误是 Undefined offset 1 导致此错误的相关代码是 parts explode microtime true nonce base convert par
  • 使用 JavaScript 或 PHP 自动检测用户当前本地时间

    我经常需要根据用户的信息或受用户的影响来显示信息actual本地时间因时区而异 是否有可靠的方法来获取用户的当前时间和 或时区 关键的问题 服务器端代码基于网站主机或用户的ISP 客户端代码基于用户的系统时钟 太容易被操纵 关键问题 是否有
  • PHP imap_search:Microsoft Exchange 邮件服务器上的 UTF-8/非 ASCII 字符

    我想从以下位置获取电子邮件outlook office365 com使用 IMAP 和 PHP 由于大多数电子邮件包含非 ASCII 字符 例如 I use UTF 8 in my imap search 功能 imap search mb
  • 在 Woocommerce 编辑订单页面中显示可编辑的自定义字段值

    我不是开发人员 但以某种方式设法将 Woocommerce 自定义字段添加到结账和订单编辑页面 有类似的问题 但我找不到正确的解决方案 自定义字段在管理订单编辑页面中可见但他们不显示值并且不会添加到订单电子邮件中 我缺少什么 请看最后的截图
  • 资源 ID #4 PHP MYSQL

    result mysql query SELECT indvsum sum1 indvsum sum2 FROM SELECT SUM Cash AS sum1 SUM Bank AS sum2 FROM players indvsum e
  • 不可编辑的文本字段

    我是新来的YII 我想知道文本字段是否YII可以设为不可编辑 如果是的话有人可以回答吗 我按照下面的方法 这是行不通的 Use readonly instead http www w3 org TR html401 interact for
  • PHP比较日期[重复]

    这个问题在这里已经有答案了 可能的重复 PHP日期比较 https stackoverflow com questions 4143741 php date compare 我从 mySQL 数据库中获取了一个日期 如下所示 2011 06
  • 使用curl作为fgetcsv的fopen文件资源的替代品

    是否可以制作curl 访问url并将结果作为文件资源 就像 fopen 是如何做到的 我的目标 解析 CSV 文件 将其传递给 fgetcsv 我的障碍 fopen被禁用 我的代码块 在 fopen 中 url http download
  • php.ini 更改,但在 Ubuntu 上无效

    我想更改 PHP 上传文件大小的限制 这是我的输出的一些信息phpinfo https www php net manual en function phpinfo php Configuration File php ini Path e
  • CodeIgniter - 为什么使用 xss_clean

    如果我正在清理我的数据库插入 并且还转义我编写的 HTMLhtmlentities text ENT COMPAT UTF 8 是否还需要使用 xss clean 过滤输入 它还有什么其他好处 xss clean http docs gip
  • 在 PHP MySQL 中使用 jQuery AJAX 提交表单而无需重新加载

    我有一个基本的注册 登录页面 它使用 php 将数据提交到 SQL 数据库 但是 我希望页面在 jQuery AJAX 的帮助下不要在提交时重定向 无论成功与否 这是我目前所拥有的 但不起作用 它不显示任何错误消息 HTML 注册 html
  • 如何在嵌套数组中查找叶数组?

    我在 PHP 中有一个嵌套数组 array 0 gt 5x 1 gt array 0 gt 1 gt 2 gt 3 3 gt array 0 gt 1 gt 2 gt array I want to find this one 0 gt 1
  • 如何导出从 HTML DOM 解析器检索到的所有图像?

    我想要 使用从我的网站获取所有图像PHP 简单 HTML DOM 解析器 http simplehtmldom sourceforge net 并将它们全部导出到我的桌面ALL立刻 Not右键单击保存或屏幕截图 OPTIONAL 保存所有h

随机推荐