使用 PHP 的 cURL GET 请求

Olorunfemi Akinlua 2023年1月30日
  1. 使用 curl_init()curl_setopt() 在 PHP 中获取请求
  2. 在 PHP 中将 cURL 与 API (JSON) 结合使用
使用 PHP 的 cURL GET 请求

在网络上,主要是 HTTPS,我们使用 GET 请求来获取特定的资源表示。为了获取数据,使用了 GET 方法。

特别是在 API 和 Web 抓取场景中,开发人员使用特定于语言的方法。我们使用 cURL 函数来处理 PHP 中的 GET 请求。

cURL 库处理从初始化、连接设置和传输到资源返回的操作。为了实现所有这些操作,可以使用内置函数,例如 curl_close()curl_init()curl_exec()

本教程讨论了 cURL GET 请求的不同用例以及实现它的相应函数。

使用 curl_init()curl_setopt() 在 PHP 中获取请求

从另一个服务器或用户获取请求的典型格式涉及使用以下基本功能。

curl_init(); // initializes a cURL session
curl_setopt(); // changes the cURL session behavior with options
curl_exec(); // executes the started cURL session
curl_close(); // closes the cURL session and deletes the variable made by curl_init();

你将看到本文中的所有四个函数以及你将使用 cURL 库编写的大部分 GET 请求代码。

现在,对于一些示例用法,我们将为变量 $url 分配我们要从中获取请求的站点的 URL,并使用 curl_init() 函数启动 cURL 会话。之后,我们指定在指定 URL 上执行 cURL 传输的选项。

第一个 curl_setopt() 函数语句包含带有 $url 变量赋值的 URL to fetch 选项。第二个 curl_setopt() 函数语句包含以字符串形式返回传输选项,包含一个布尔值。

<?php

$url = "https://reqbin.com/echo";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$resp = curl_exec($curl);
curl_close($curl);
var_dump($resp);

?>

上述 PHP 代码的输出如下。

在 PHP 中使用 curl_init 和 curl_setopt 获取请求

在 PHP 中将 cURL 与 API (JSON) 结合使用

通常,当与 API 交互时,数据响应通常是 JSON 并使用 cURL 函数,我们可以使用 curl_getinfo()json_encode() 函数以属性值对和数组格式正确处理这些数据对象,其中。

在这里,我们将与演示 User API 进行交互,使用 cURL 库获取 JSON 数据,并使用适当的函数对 JSON 文件进行编码。

  1. 初始化 URL 变量和 cURL 会话

    $url = 'https://jsonplaceholder.typicode.com/users';
    // Sample example to get data.
    $resource = curl_init($url);
    
  2. 设置 cURL 选项和信息变量。

    curl_setopt($resource, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($resource);
    $info = curl_getinfo($resource);
    $code = curl_getinfo($resource, CURLINFO_HTTP_CODE);
    
  3. 调试以检查响应状态代码(可选步骤),但你应该看到 200

    echo $result.'<br>';
    echo "<pre>";
    print_r($info);
    echo "</pre>";
    
    // Get response status code
    echo "<pre>";
    print_r($code);
    echo "</pre>";
    
  4. 关闭 cURL 会话以更好地管理资源。

    curl_close($resource);
    
  5. 创建数组模板来存储通过 JSON 从 API 获取的数据。

    // set_opt_array
    $user = [
    	'name' => 'John Doe',
    	'username' => 'john',
    	'email' => 'john@example.com'
    ];
    
  6. 使用 curl_init()curl_setopt_array() 使用所有重要选项处理从 URL 解析的 JSON 数据。

    $resource = curl_init();
    curl_setopt_array($resource, [
    	CURLOPT_URL => $url,
    	CURLOPT_RETURNTRANSFER => true,
    	CURLOPT_POST => true,
    	CURLOPT_HTTPHEADER => ['content-type: application/json'],
    	CURLOPT_POSTFIELDS => json_encode($user),
    ]);
    
  7. 分别使用 curl_exec()curl_close() 函数执行初始化的 cURL 会话和关闭 cURL 会话并释放所有资源。但是,在 PHP 8.0.0 及更高版本中,curl_close() 函数无效

    $result = curl_exec($resource); // creates and returns result
    curl_close($resource);
    echo $result;
    

代码的输出将产生下面的 PHP 多维数组。

[
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "Shanna@melissa.tv",
    "address": {
      "street": "Victor Plains",
      "suite": "Suite 879",
      "city": "Wisokyburgh",
      "zipcode": "90566-7771",
      "geo": {
        "lat": "-43.9509",
        "lng": "-34.4618"
      }
    },
    "phone": "010-692-6593 x09125",
    "website": "anastasia.net",
    "company": {
      "name": "Deckow-Crist",
      "catchPhrase": "Proactive didactic contingency",
      "bs": "synergize scalable supply-chains"
    }
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "email": "Nathan@yesenia.net",
    "address": {
      "street": "Douglas Extension",
      "suite": "Suite 847",
      "city": "McKenziehaven",
      "zipcode": "59590-4157",
      "geo": {
        "lat": "-68.6102",
        "lng": "-47.0653"
      }
    },
    "phone": "1-463-123-4447",
    "website": "ramiro.info",
    "company": {
      "name": "Romaguera-Jacobson",
      "catchPhrase": "Face to face bifurcated interface",
      "bs": "e-enable strategic applications"
    }
  },
....
]
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn