[*]Получить запрос, на основании которого
[*]Отправить внешний HTTP-запрос
[*]Проанализировать ответ, на основе которого
[*]Вернуть ответ
Я планирую иметь несколько функций, которые будут следовать этому шаблону. Они вызываются один за другим, последовательно.
В Symfony 4.3 представлены компонент HttpClient и компонент BrowserKit, которые на первый взгляд кажутся отвечающими всем требованиям. Но, как оказалось, все становится сложнее. Внешние HTTP-запросы отправляются на сервер, который отслеживает сеансы с помощью файлов cookie, что не должно быть чем-то необычным. Если запрос отправляется без файлов cookie, сервер всегда отвечает тем же содержимым целевой страницы. Итак, нам понадобится печенье. Не беспокойтесь, ответ на первоначальный запрос содержит заголовок «Set-Cookie», содержащий файл cookie, который отправляется в заголовке «Cookie» в последующих запросах. HTTP-статус ответа с файлом cookie — «302 Found», который в обычной веб-среде с помощью веб-браузера перенаправляет на следующую страницу с тем же файлом cookie в запросе. Воспроизвести это действие в моем контроллере Symfony кажется очень сложной задачей. Подробно о шаге 2 того, что я хочу сделать сейчас:
2.a. Отправьте внешний HTTP-запрос
2.b. Прочитайте файл cookie из ответа 302 (без автоматического перенаправления)
2.c. Установите заголовок «Cookie» последующего запроса, значение которого поступает из 2.b.
2.d. Отправьте запрос новой цели (указанной в заголовке «Местоположение» ответа 302)
Вот часть кода контроллера:
Код: Выделить всё
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpClient\Exception\RedirectionException;
use Symfony\Component\HttpFoundation\JsonResponse;
public function init(Request $request): JsonResponse
{
$url = "external url";
$client = HttpClient::create();
try {
$response = $client->request('GET', $url, [
'max_redirects' => -1
]);
} catch (RedirectionException $redirectionException) {
}
return new JsonResponse([], 200);
}
исключение перенаправления, и ответ 302 с файлом cookie, похоже, будет потерян.
Я также пробовал Компонент HttpBrowser:
Код: Выделить всё
$cookieJar = new CookieJar();
$client = new HttpBrowser(HttpClient::create(), null, $cookieJar);
$client->request('GET', $url);
Я понимаю, что Упомянутые здесь компоненты являются новыми для Symfony 4.3 и «экспериментальными», но я также не думаю, что моя задача слишком сложна или необычна. Но, может быть, есть другие http-клиенты для Symfony, которые лучше подойдут для этой задачи?
Подробнее здесь: https://stackoverflow.com/questions/578 ... n-response
Мобильная версия