2015-04-23 3 views
4

Цель состоит в том, чтобы заполнить form[id=thisAwesomeRemoteForm][action=#] на удаленном веб-сайте. Существует только одно поле (input[name=awesomeField]) для заполнения, а затем форма должна быть отправлена. В качестве окончательного требования пользователю необходимо перенаправить с моего веб-сайта на этот удаленный веб-сайт, как если бы он отправил форму на удаленном веб-сайте.Как использовать Goutte для отправки формы и получения окончательного URI?

Короче говоря, мне нужен пользователь, чтобы иметь возможность щелкнуть мою ссылку, заставить PHP выполнить эту работу и перенаправить на этот удаленный веб-сайт, как если бы он заполнил и отправил форму на удаленном веб-сайте. Я не должен заставлять пользователя заполнять удаленную форму самостоятельно.

код до сих пор:

use Goutte\Client; 
// ... 
public function gotoAction($data) 
{ 
    $client = new Client(); 
    $crawler = $client->request('GET', self::MY_URL); 

    $form = $crawler->filter('form[id=thisAwesomeRemoteForm]')->form(); 

    $form->setValues(array('awesomeField' => $data)); 
    $crawler = $client->submit($form); 

    return $this->redirect($form->getUri()); 
} 

До сих пор, я перенаправлены на самый первый URL, где form это и не там, где form должно привести. Однако поле заполнено нужными данными.

Является ли мой код правильным для достижения моей цели (и, следовательно, это удаленный веб-сайт, который может использовать JavaScript для отправки формы или что-то еще), или мне не хватает чего-то достаточно очевидного?

+0

Где эта форма перенаправлять? Вы контролируете это? Является ли запрос постоянным между запросом 'Goutte' и перенаправлением. Отображает ли перенаправление пустую форму или форма уже отправлена? –

+0

Привет @ A.L! Нет. Я не могу контролировать форму на удаленном веб-сайте. Форма приводит к другой странице на удаленном сервере. Что вы подразумеваете под «постоянным запросом»? Я не думаю, что форма представлена. – D4V1D

+0

* Постоянный запрос * Я имел в виду, что поскольку Goutte и ваш пользователь являются двумя разными посетителями с точки зрения удаленного сервера, я не знаю, как вы можете получить результат представленной формы и отобразить ее пользователю. –

ответ

0

Goutte по большому счету адаптер для Guzzle на API Symfony\Browserkit. Основываясь на беглом анализе исходного кода Goutte\Client, effectiveUrl() не используется и не переносится. Это означало бы, что если произойдет переадресация, вы не будете «собирать ее».

Вы можете выполнять те же функции, достаточно легко, используя базовые компоненты (жрать, DomCrawler), используя следующий фрагмент кода:

$client = new GuzzleHttp\Client([ 
    'debug' => true, // only to troubleshoot 
); 

// Obtain the html page with the form 
$request = $client->createRequest('GET', $url); 
$response = $client->send($request); 
// or $response = $client->get($url); 

// create crawler and obtain the form. 
$crawler = new Symfony\Component\DomCrawler\Crawler(null, $response->getEffectiveUrl()); 
$crawler->addContent(
    $response->getBody()->__toString(), 
    $response->getHeader('Content-Type') 
); 

$form = $crawler->form('form_identifier'); 
$form->setValues($data_array); 

//form submission 
$request = $client->createRequest(
    $form->getMethod(), 
    $form->getUrl(), 
    [ 
     'body' => $form->getPhpValues(), 
]); 

$response = $client->send($request); 
+0

Возможно, я пропустил что-то в этом вопросе, но Guzzle по умолчанию использует cURL, который по умолчанию настроен на автоматический ответ на до пяти запросов на перенаправление. См. 'CURLOPT_FOLLOWLOCATION' и' CURLOPT_MAXREDIRS' в [списке опций] (https://php.net/manual/en/function.curl-setopt.php). – halfer

Смежные вопросы