|
| 1 | +Podstawy użytkowania |
| 2 | +==================== |
| 3 | + |
| 4 | +W celu wysłania żądania HTTP konieczne jest zainicjowanie obiektu [[\yii\httpclient\Client]] i użycie jego metody `createRequest()`. |
| 5 | +Następnie należy skonfigurować wszystkie parametry tego żądania według własnych potrzeb i tak przygotowane wysłać. |
| 6 | +W rezultacie otrzymujemy obiekt [[\yii\httpclient\Response]], który przechowuje wszystkie informacje odpowiedzi. |
| 7 | +Przykładowo: |
| 8 | + |
| 9 | +```php |
| 10 | +use yii\httpclient\Client; |
| 11 | + |
| 12 | +$client = new Client(); |
| 13 | +$response = $client->createRequest() |
| 14 | + ->setMethod('post') |
| 15 | + ->setUrl('http://example.com/api/1.0/users') |
| 16 | + ->setData(['name' => 'John Doe', 'email' => 'johndoe@example.com']) |
| 17 | + ->send(); |
| 18 | +if ($response->isOk) { |
| 19 | + $newUserId = $response->data['id']; |
| 20 | +} |
| 21 | +``` |
| 22 | + |
| 23 | +Aby uprościć przygotowywanie żądania, można użyć skrótowych metod `get()`, `post()`, `put()`, itd. |
| 24 | +W przypadku korzystania z pojedynczej instancji [[\yii\httpclient\Client]] dla wielu żądań skierowanych do tej samej domeny |
| 25 | +(np. łącząc się z REST API), można ustawić tę domenę jako wartość właściwości `baseUrl`. Pozwala to na określanie jedynie |
| 26 | +relatywnych adresów URL podczas tworzenia żądania. |
| 27 | +Dzięki temu kilka następujących po sobie żądań skierowanych do jakiegoś REST API może wyglądać jak poniżej: |
| 28 | + |
| 29 | +```php |
| 30 | +use yii\httpclient\Client; |
| 31 | + |
| 32 | +$client = new Client(['baseUrl' => 'http://example.com/api/1.0']); |
| 33 | + |
| 34 | +$newUserResponse = $client->post('users', ['name' => 'John Doe', 'email' => 'johndoe@example.com'])->send(); |
| 35 | +$articleResponse = $client->get('articles', ['name' => 'Yii 2.0'])->send(); |
| 36 | +$client->post('subscriptions', ['user_id' => $newUserResponse->data['id'], 'article_id' => $articleResponse->data['id']])->send(); |
| 37 | +``` |
| 38 | + |
| 39 | + |
| 40 | +## Korzystanie z różnych formatów treści |
| 41 | + |
| 42 | +Dane żądania HTTP są domyślnie przesyłane w formacie 'form-urlencoded', np. `param1=value1¶m2=value2`. |
| 43 | +Jest on powszechnie wykorzystywany w formularzach web, ale już nie dla REST API, które zwykle wymaga treści w formacie |
| 44 | +JSON lub XML. Format żądania można ustawić za pomocą właściwości `format` lub metody `setFormat()`. |
| 45 | +Wspierane są następujące formaty: |
| 46 | + |
| 47 | + - [[\yii\httpclient\Client::FORMAT_JSON]] - format JSON, |
| 48 | + - [[\yii\httpclient\Client::FORMAT_URLENCODED]] - łańcuch znaków kwerendy zakodowany wg wytycznych dokumentu RFC1738, |
| 49 | + - [[\yii\httpclient\Client::FORMAT_RAW_URLENCODED]] - łańcuch znaków kwerendy zakodowany z opcjami predefiniowanej stałej PHP_QUERY_RFC3986, |
| 50 | + - [[\yii\httpclient\Client::FORMAT_XML]] - format XML. |
| 51 | + |
| 52 | +Przykładowo: |
| 53 | + |
| 54 | +```php |
| 55 | +use yii\httpclient\Client; |
| 56 | + |
| 57 | +$client = new Client(['baseUrl' => 'http://example.com/api/1.0']); |
| 58 | +$response = $client->createRequest() |
| 59 | + ->setFormat(Client::FORMAT_JSON) |
| 60 | + ->setUrl('articles/search') |
| 61 | + ->setData([ |
| 62 | + 'query_string' => 'Yii', |
| 63 | + 'filter' => [ |
| 64 | + 'date' => ['>' => '2015-08-01'] |
| 65 | + ], |
| 66 | + ]) |
| 67 | + ->send(); |
| 68 | +``` |
| 69 | + |
| 70 | +Obiekt odpowiedzi automatycznie rozpoznaje jej format, opierając się na nagłówku 'Content-Type' i samej treści, zatem |
| 71 | +w większości przypadków nie jest wymagane określanie tego formatu, wystarczy przetworzyć ją używając metody `getData()` |
| 72 | +lub właściwości `data`. Rozwijając powyższy przykład, można otrzymać dane odpowiedzi następująco: |
| 73 | + |
| 74 | +```php |
| 75 | +$responseData = $response->getData(); // pobierz wszystkie artykuły |
| 76 | +count($response->data) // policz artykuły |
| 77 | +$article = $response->data[0] // pobierz pierwszy artykuł |
| 78 | +``` |
| 79 | + |
| 80 | + |
| 81 | +## Praca z niesformatowaną treścią |
| 82 | + |
| 83 | +Korzystanie z wbudowanych formaterów nie jest obowiązkowe. Można skonfigurować żądanie HTTP, aby przekazywało |
| 84 | +niesformatowaną treść i jednocześnie można przetwarzać niesformatowaną treść uzyskaną w odpowiedzi. Dla przykładu: |
| 85 | + |
| 86 | +```php |
| 87 | +use yii\httpclient\Client; |
| 88 | + |
| 89 | +$client = new Client(['baseUrl' => 'http://example.com/api/1.0']); |
| 90 | +$response = $client->createRequest() |
| 91 | + ->setUrl('articles/search') |
| 92 | + ->addHeaders(['content-type' => 'application/json']) |
| 93 | + ->setContent('{query_string: "Yii"}') |
| 94 | + ->send(); |
| 95 | + |
| 96 | +echo 'Search results:<br>'; |
| 97 | +echo $response->content; |
| 98 | +``` |
| 99 | + |
| 100 | +[[\yii\httpclient\Request]] formatuje przekazywane `data`, tylko jeśli `content` nie jest ustawiony. |
| 101 | +[[\yii\httpclient\Response]] przetwarza `content`, tylko jeśli `data` jest wywołane. |
| 102 | + |
| 103 | + |
| 104 | +## Prekonfiguracja obiektów żądania i odpowiedzi |
| 105 | + |
| 106 | +Używając pojedynczej instancji [[\yii\httpclient\Client]] dla kilku podobnych żądań, przykładowo pracując z REST API, |
| 107 | +można uprościć i przyspieszyć pisanie kodu, dodając własną konfigurację dla obiektów żądania i odpowiedzi. Można to |
| 108 | +zrobić korzystając z pól `requestConfig` i `responseConfig` w [[\yii\httpclient\Client]]. |
| 109 | +Przykładowo, aby ustawić format JSON dla wszystkich żądań klienta: |
| 110 | + |
| 111 | +```php |
| 112 | +use yii\httpclient\Client; |
| 113 | + |
| 114 | +$client = new Client([ |
| 115 | + 'baseUrl' => 'http://example.com/api/1.0', |
| 116 | + 'requestConfig' => [ |
| 117 | + 'format' => Client::FORMAT_JSON |
| 118 | + ], |
| 119 | + 'responseConfig' => [ |
| 120 | + 'format' => Client::FORMAT_JSON |
| 121 | + ], |
| 122 | +]); |
| 123 | + |
| 124 | +$request = $client->createRequest(); |
| 125 | +echo $request->format; // zwraca: 'json' |
| 126 | +``` |
| 127 | + |
| 128 | +> Tip: można nawet określić własne klasy dla obiektów żądania i odpowiedzi, aby uzyskać dodatkowe funkcjonalności - |
| 129 | + w tym celu należy użyć klucza 'class' w tablicy konfiguracyjnej. |
| 130 | + |
| 131 | + |
| 132 | +## Praca z nagłówkami |
| 133 | + |
| 134 | +Można zdefiniować nagłówki żądania za pomocą metod `setHeaders()` i `addHeaders()`. |
| 135 | +Metoda `getHeaders()` lub właściwość `headers` służy do pobrania już zdefiniowanych nagłówków w postaci instancji klasy |
| 136 | +[[\yii\web\HeaderCollection]]. Przykładowo: |
| 137 | + |
| 138 | +```php |
| 139 | +use yii\httpclient\Client; |
| 140 | + |
| 141 | +$client = new Client(['baseUrl' => 'http://example.com/api/1.0']); |
| 142 | +$request = $client->createRequest() |
| 143 | + ->setHeaders(['content-type' => 'application/json']) |
| 144 | + ->addHeaders(['user-agent' => 'My User Agent']); |
| 145 | + |
| 146 | +$request->getHeaders()->add('accept-language', 'en-US;en'); |
| 147 | +$request->headers->set('user-agent', 'User agent override'); |
| 148 | +``` |
| 149 | + |
| 150 | +Kiedy obiekt odpowiedzi jest już gotowy, można pobrać wszystkie nagłówki odpowiedzi za pomocą metody `getHeaders()` lub |
| 151 | +właściwości `headers`: |
| 152 | + |
| 153 | +```php |
| 154 | +$response = $request->send(); |
| 155 | +echo $response->getHeaders()->get('content-type'); |
| 156 | +echo $response->headers->get('content-encoding'); |
| 157 | +``` |
| 158 | + |
| 159 | + |
| 160 | +## Praca z ciasteczkami |
| 161 | + |
| 162 | +Pomimo tego, że ciasteczka są przesyłane wyłącznie w nagłówkach, [[\yii\httpclient\Request]] i [[\yii\httpclient\Request]] |
| 163 | +dostarczają oddzielny interfejs dla pracy z nimi, używając [[\yii\web\Cookie]] i [[\yii\web\CookieCollection]]. |
| 164 | + |
| 165 | +Można zdefiniować ciasteczka żądania używając metod `setCookies()` lub `addCookies()`. |
| 166 | +Metoda `getCookies()` lub właściwość `cookies` służy do pobrania już zdefiniowanych ciasteczek w postaci instancji klasy |
| 167 | +[[\yii\web\CookieCollection]]. Przykładowo: |
| 168 | + |
| 169 | +```php |
| 170 | +use yii\httpclient\Client; |
| 171 | +use yii\web\Cookie; |
| 172 | + |
| 173 | +$client = new Client(['baseUrl' => 'http://example.com/api/1.0']); |
| 174 | +$request = $client->createRequest() |
| 175 | + ->setCookies([ |
| 176 | + ['name' => 'country', 'value' => 'USA'], |
| 177 | + new Cookie(['name' => 'language', 'value' => 'en-US']), |
| 178 | + ]) |
| 179 | + ->addCookies([ |
| 180 | + ['name' => 'view_mode', 'value' => 'full'] |
| 181 | + ]); |
| 182 | + |
| 183 | +$request->cookies->add(['name' => 'display-notification', 'value' => '0']); |
| 184 | +``` |
| 185 | + |
| 186 | +Kiedy obiekt odpowiedzi jest już gotowy, można pobrać wszystkie ciasteczka odpowiedzi za pomocą metody `getCookies()` lub |
| 187 | +właściwości `cookies`: |
| 188 | + |
| 189 | +```php |
| 190 | +$response = $request->send(); |
| 191 | +echo $response->getCookies()->get('country'); |
| 192 | +echo $response->headers->get('PHPSESSID'); |
| 193 | +``` |
| 194 | + |
| 195 | +Można przekazać ciasteczka pomiędzy obiektem odpowiedzi i żądania po prostu je kopiując. |
| 196 | +Przykładowo, musimy edytować profil użytkownika w aplikacji web, dostępnej jedynie po zalogowaniu - konieczne jest zatem |
| 197 | +zalogowanie się i następnie użycie nowoutworzonej sesji dla uwierzytelnienia dalszej aktywności: |
| 198 | + |
| 199 | +```php |
| 200 | +use yii\httpclient\Client; |
| 201 | + |
| 202 | +$client = new Client(['baseUrl' => 'http://example.com']); |
| 203 | + |
| 204 | +$loginResponse = $client->post('login', [ |
| 205 | + 'username' => 'johndoe', |
| 206 | + 'password' => 'somepassword', |
| 207 | +])->send(); |
| 208 | + |
| 209 | +// $loginResponse->cookies->get('PHPSESSID') - przechowuje ID nowej sesji |
| 210 | + |
| 211 | +$client->post('account/profile', ['birthDate' => '10/11/1982']) |
| 212 | + ->setCookies($loginResponse->cookies) // przekazuje ciasteczka odpowiedzi do żądania |
| 213 | + ->send(); |
| 214 | +``` |
0 commit comments