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内容 的相关文章

  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • CodeIgniter 自定义库未加载

    我是 CodeIgniter 的新手 并尝试用它开发一个相当简单的应用程序 只是一个用于处理想要娱乐中心通行证的员工的注册的表单 我正在尝试将事物分开以使它们更清晰 这是代码 应用程序 控制器 reccenter php class Rec
  • setcookie with expire=0 浏览器关闭后不会过期

    我使用setcookie来制作一个过期 0的cookie 从 PHP 文档来看 link http php net manual en function setcookie php cookie 过期的时间 这是一个 Unix 时间戳 所以
  • 用户可以更改 PHP 中 $_SESSION 的值吗?

    这是我的想法 我想知道是否可能 将信息存储在 PHP 的 SESSION 变量中有多安全 在 SESSION 变量中存储变量有两个潜在的 不安全 风险 另一个答案所描述的第一个称为 会话固定 这里的想法是 由于会话 ID 存储在 cooki
  • Yii2 - 错误请求 (#400) |前端和后端cookie

    仅当我打开时才会出现此问题frontend and backend在相同的browser 设想 与后端交互 gt 切换选项卡 gt 与前端交互 gt 切换选项卡返回 gt 与后端交互 gt 错误请求 400 Cookie 后端 identi
  • AWS-PHP-SDK / SNS 直接寻址返回错误

    您好 我正在使用 Laravel 4 设置来利用 AWS SNS 向我的 iOS 设备发送推送消息 从 AWS 控制台向我的设备发布命令效果很好 然后我尝试从 PHP sns AWS get sns sns gt publish array
  • 是否可以将路由参数传递给 Laravel 中的控制器构造函数?

    是否可以将路由参数 或路由段 注入到控制器构造函数中 您找到一些代码来澄清我的问题 class TestController protected param public function construct paramFromRoute
  • Xdebug V3 不会停止 VSCode 中的断点

    我正在尝试使用 VSCode 在 XAMPP 上进行调试 但没有成功 我知道有很多关于这个的问题 我已经尽了一切努力 但仍然行不通 我的 xdebug 扩展确实有一件奇怪的事情 我目前使用 PHP v7 4 12 和 Xdebug 版本 3
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 使用 PHP glob 列出 FTP 服务器上的文件不起作用

    我使用此代码来访问目录 location files pictures glob location png 我想使用 FTP 访问远程路径 location opendir ftp user password host name files
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 如何在 Windows 上安装 Zend 框架

    安装 Zend Framework 就是这么简单 是的 对 好吧 我正在写一本初学者的书 有一件不太详细的事情是最重要的部分 安装该死的东西 浏览了几个小时的快速入门指南后 它只说 下载 Zend 添加包含目录 bla bla 然后就完成了
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • session_start():无法解码会话对象

    我有时在使用 CodeIgniter 时遇到以下问题 错误 2019 03 05 19 57 26 gt 严重性 警告 gt session start 无法解码会话对象 会话已被销毁 system libraries Session Se
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • PayPal 网关已拒绝请求。安全标头无效(#10002:安全错误 Magento

    在 magento 中增加 PayPal 预付款 我已填写 magento admin 中的所有凭据 但是当我进入前端并单击 pay pal 按钮时 它给出了 PayPal 网关已拒绝请求 安全标头无效 10002 安全错误 我用谷歌搜索了

随机推荐