<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Symfony `HttpClient`教程 > 原文: [http://zetcode.com/symfony/httpclient/](http://zetcode.com/symfony/httpclient/) Symfony `HttpClient`教程展示了如何使用`HttpClient`組件在 Symfony 中創建 HTTP 請求。 該組件提供使用 API?? 的工具,并支持同步和異步操作。 有關更多信息,請閱讀官方 [HttpComponent](https://symfony.com/doc/current/components/http_client.html) 文檔。 ## Symfony Symfony 是一組可重用的 PHP 組件和一個用于 Web 項目的 PHP 框架。 Symfony 于 2005 年發布為免費軟件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受到 Spring 框架的極大啟發。 在示例中,我們將使用`httpbin.org`和`http://jsonplaceholder.typicode.com/`在線服務。 ```php $ composer require symfony/http-client $ composer require symfony/var-dumper ``` 我們安裝了`HttpClient`和`var-dumper`組件。 ## `HttpClient` GET 請求 HTTP 定義了一組請求方法,以指示要對給定資源執行的所需操作。 GET 請求用于從指定資源請求數據。 使用 GET 的請求應僅檢索數據,而對數據沒有其他影響。 > **注意**:建議使用 HTTP 方法的目的和影響; 這些不是嚴格的規則。 這就是我們前面說過 GET 方法不應對數據產生影響的原因。 實際上,這并不總是遵循的。 `get_request.php` ```php <?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'http://webcode.me'); $statusCode = $response->getStatusCode(); echo $statusCode . "\n"; $contentType = $response->getHeaders()['content-type'][0]; echo $contentType . "\n"; $content = $response->getContent(); echo $content . "\n"; ``` 該示例創建`HttpClient`,并向指定的網頁發出 GET 請求。 > **注意**:響應始終是異步的,因此對方法的調用將立即返回,而不是等待接收響應。 有諸如`getStatusCode()`和`getContent()`之類的阻塞方法,它們會等到接收到完整的響應內容為止。 ```php $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'http://webcode.me'); ``` 我們用`HttpClient::create()`創建一個`HttpClient`。 使用`request()`方法生成 GET 請求。 ```php $statusCode = $response->getStatusCode(); echo $statusCode . "\n"; ``` 我們使用`getStatusCode()`方法獲取狀態代碼。 ```php $contentType = $response->getHeaders()['content-type'][0]; echo $contentType . "\n"; ``` 從響應的標題中,我們獲得內容類型。 ```php $content = $response->getContent(); echo $content . "\n"; ``` 最后,我們使用`getContent()`方法獲得頁面的內容。 ```php $ php get_request.php 200 text/html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My html page</title> </head> <body> <p> Today is a beautiful day. We go swimming and fishing. </p> <p> Hello there. How are you? </p> </body> </html> ``` 這是輸出。 ## `HttpClient`用戶代理 創建`HttpClient`時,我們可以傳遞一些選項,例如標頭值。 `user_agent.php` ```php <?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(['headers' => [ 'User-Agent' => 'PHP console app', ]]); $response = $httpClient->request('GET', 'https://httpbin.org/user-agent'); echo $response->getContent() . "\n"; ``` 我們連接到`httpbin.org`網站,該網站是用于測試 HTTP 請求&響應的在線工具。 ```php $httpClient = HttpClient::create(['headers' => [ 'User-Agent' => 'PHP console app', ]]); ``` 在標題數組中,我們添加`User-Agent`選項。 ```php $response = $httpClient->request('GET', 'https://httpbin.org/user-agent'); ``` 我們將 GET 請求發送到`https://httpbin.org/user-agent` URL,該 URL 返回請求的用戶代理選項。 ## `HttpClient toArray()` `toArray()`方法通常將響應主體解碼為數組,并從 JSON 有效負載解碼為數組。 `content_array.php` ```php <?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'https://jsonplaceholder.typicode.com/posts/2/'); dump($response->toArray()); ``` 該示例向`jsonplaceholder.typicode.com`在線服務網站發出 GET 請求,該網站以 JSON 格式返回 ID 為 2 的帖子。 ```php dump($response->toArray()); ``` 我們轉儲`toArray()`方法的輸出。 ```php $ php content_array.php array:4 [ "userId" => 1 "id" => 2 "title" => "qui est esse" "body" => """ est rerum tempore vitae\n sequi sint nihil reprehenderit dolor beatae ea dolores neque\n fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\n qui aperiam non debitis possimus qui neque nisi nulla """ ] ``` 這是輸出。 ## `HttpClient` POST 數據 發布請求用于將數據發送到服務器。 數據位于 HTTP 請求的請求正文中。 發布請求永遠不會被緩存,它們不會保留在瀏覽器歷史記錄中,也無法被添加書簽,并且數據長度沒有限制。 `post_data.php` ```php <?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('POST', 'https://httpbin.org/post', [ 'body' => ['msg' => 'Hello there'] ]); echo $response->getContent(); ``` 在示例中,我們在 POST 請求中將消息變量發送到指定的 URL。 在響應對象中,我們找到了 POST 請求中發送的數據。 ```php $ php post_data.php { "args": {}, "data": "", "files": {}, "form": { "msg": "Hello there" }, ... } ``` 這是輸出。 ## `HttpClient`重定向 URL 重定向是將請求從一頁轉發到另一頁的過程。 當 Web 瀏覽器嘗試打開已重定向的 URL 時,將打開一個具有其他 URL 的頁面。 一個 URL 可能有多個重定向。 使用重定向的原因: * URL 縮短 * 防止在移動網頁時斷開鏈接 * 允許屬于同一所有者的多個域名引用一個網站 * 隱私保護 * HTTP 到 HTTP 的過渡 * 惡意目的,例如網絡釣魚攻擊或惡意軟件分發 發出請求時,`HttpClient`遵循重定向,最多 20 個。 `max_redirects`屬性用于配置此行為。 值 0 表示不遵循任何重定向。 `redirect.php` ```php <?php require 'vendor/autoload.php'; use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'https://httpbin.org/redirect/4', [ 'max_redirects' => 3, ]); echo $response->getStatusCode(); ``` 我們將 GET 請求發送到重定向四次的 URL,同時將`max_redirects`屬性設置為三。 這意味著我們獲得 302 重定向狀態代碼。 如果我們增加`max_redirects`值,我們應該得到 200。 ## `HttpClient`查詢參數 查詢參數是統一資源定位器(URL)的一部分,該 URL 將值分配給指定的參數。 這是將數據發送到目標服務器的一種方法。 ```php http://example.com/api/users?name=John%20Doe&occupation=gardener ``` 查詢參數在`?`字符之后指定。`&`分隔了多個字段。 特殊字符(例如空格)被編碼。 在上面的字符串中,空格用`%20`值編碼。 Symfony `HttpClient`在將值包含在 URL 中之前會自動對其進行編碼。 `query_params.php` ```php <?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'https://httpbin.org/get', [ 'query' => [ 'name' => 'John Doe', ], ]); echo $response->getContent(); ``` 我們將`name`字段發送到`https://httpbin.org/get` URL。 在響應中,我們返回了 URL 參數。 ```php $ php query_params.php { "args": { "name": "John Doe" }, "headers": { "Accept-Encoding": "deflate, gzip", "Host": "httpbin.org", "User-Agent": "Symfony HttpClient/Curl" }, ... } ``` 這是輸出。 ## 使用 httpbin 的 Docker 容器 `httpbin.org`還提供了一個用于測試的 Docker 容器。 ```php $ docker run -p 80:80 kennethreitz/httpbin ``` 我們運行容器。 `docker_ex.php` ```php <?php require 'vendor/autoload.php'; use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $response = $httpClient->request('GET', 'http://localhost:80/anything', [ 'json' => ['message' => 'Hello there'], ]); dump($response->toArray()); ``` 在示例中,我們使用 httpbin 的服務連接到容器。 `localhost:80/anything`返回傳遞給請求的任何內容。 ## HTTP 基本認證 HTTP 基本認證是一種簡單的質詢和響應機制,其中服務器從客戶端請求憑據。 客戶端在授權標頭中將憑據傳遞給服務器。 認證信息不以任何方式加密或哈希。 它使用 Base64 算法編碼。 因此,僅將 HTTP 基本認證與`HTTPS`一起使用才被認為是安全的。 HTTP 基本認證使用 HTTP 標頭中的標準字段,從而無需握手。 `authenticate.php` ```php <?php require('vendor/autoload.php'); use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create([ 'auth_basic' => ['user7', 'passwd'] ]); $response = $httpClient->request('GET', 'https://httpbin.org/basic-auth/user7/passwd'); echo $response->getStatusCode(); dump($response); ``` 在示例中,我們使用 HTTP 基本認證。 ```php $httpClient = HttpClient::create([ 'auth_basic' => ['user7', 'passwd'] ]); ``` HTTP 基本認證通過`auth_basic`選項指定。 所有請求將使用相同的憑據。 ```php $response = $httpClient->request('GET', 'https://httpbin.org/basic-auth/user7/passwd'); ``` 不要與 URL 中的用戶名和密碼混淆; 這僅用于在 httpbin 的服務中進行測試。 ## `HttpClient`流數據 自 HTTP 1.1 以來,塊傳輸編碼是一種流數據傳輸機制。 在分塊傳輸編碼中,數據流被分為一系列不重疊的塊。 塊彼此獨立地發送和接收。 每個塊之前都有其大小(以字節為單位)。 在 Symfony `HttpClient`中,流傳輸是通過`stream()`完成的。 `streaming.php` ```php <?php require 'vendor/autoload.php'; use Symfony\Component\HttpClient\HttpClient; $httpClient = HttpClient::create(); $url = 'https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-mini-memstick.img'; $response = $httpClient->request('GET', $url, [ 'buffer' => false, ]); if (200 !== $response->getStatusCode()) { throw new \Exception('Failed to create a request'); } $fileHandler = fopen('freebsd-12.0-amd64-mini-memstick.iso', 'w'); foreach ($httpClient->stream($response) as $chunk) { fwrite($fileHandler, $chunk->getContent()); } ``` 在示例中,我們下載了 FreeBSD ISO 映像。 ```php $response = $httpClient->request('GET', $url, [ 'buffer' => false, ]); ``` 我們創建一個對指定 URL 的 GET 請求; (可選)我們可以關閉內存緩沖。 ```php $fileHandler = fopen('freebsd-12.0-amd64-mini-memstick.iso', 'w'); foreach ($httpClient->stream($response) as $chunk) { fwrite($fileHandler, $chunk->getContent()); } ``` 我們以塊的形式獲取響應內容,并將其保存在文件中。 ## Symfony `HttClient` Webapp 示例 在下面的示例中,我們創建一個 Symfony Web 應用,該應用使用`HttpClient`生成請求。 我們使用`HttpClientInterface`注入`HttpClient`。 該應用向`https://jsonplaceholder.typicode.com/users`發出 GET 請求,該請求返回十個用戶。 ```php $ composer create-project symfony/skeleton symfapp $ cd symfapp $ composer require annotations $ composer require maker server --dev $ composer require symfony/http-client ``` 我們創建一個新的 Symfony 框架應用并安裝一些依賴項。 `config/packages/framework.yaml` ```php framework: ... http_client: max_host_connections: 5 default_options: max_redirects: 3 ``` 在`framework.yaml`文件中,我們可以配置`HttpClient`。 ```php $ php bin/console make:controller DataController ``` 我們創建一個新的控制器。 `src/Controller/DataController.php` ```php <?php namespace App\Controller; use App\Service\UserService; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class DataController extends AbstractController { /** * @Route("/data", name="data") */ public function index(UserService $userService): Response { $data = $userService->getUsers(); return $this->json($data); } } ``` `DataController`注入`UserService`,調用其`getUsers()`方法以檢索數據。 數據作為 JSON 返回給調用方。 `src/Service/UserService.php` ```php <?php namespace App\Service; use Symfony\Contracts\HttpClient\HttpClientInterface; class UserService { private $httpClient; public function __construct(HttpClientInterface $httpClient) { $this->httpClient = $httpClient; } public function getUsers(): Array { $response = $this->httpClient->request('GET', 'https://jsonplaceholder.typicode.com/users'); $data = $response->getContent(); $decoded = json_decode($data); return $decoded; } } ``` 這是`UserService.` ```php public function __construct(HttpClientInterface $httpClient) { $this->httpClient = $httpClient; } ``` 我們用`HttpClientInterface`注入 HttpClient。 ```php public function getUsers(): Array { $response = $this->httpClient->request('GET', 'https://jsonplaceholder.typicode.com/users'); $data = $response->getContent(); $decoded = json_decode($data); return $decoded; } ``` 我們生成一個 GET 請求,解碼數據并返回它。 ```php $ php bin/console server:run ``` 我們運行該應用并導航到`localhost:8000/data`。 在本教程中,我們使用了 Symfony `HttpClient`組件。 您可能也對以下相關教程感興趣: [Symfony 簡介](/symfony/intro/), [Symfony 驗證教程](/symfony/validation/), [Symfony 服務教程](/symfony/service/), [Symfony 表單教程](/symfony/form/) , [PHP 教程](/lang/php/)或列出[所有 Symfony 教程](/all/#symfony)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看