目的是填充远程网站上的form[id=thisAwesomeRemoteForm][action=#]
。只有一个字段(input[name=awesomeField]
)可以填充,然后需要提交表单。作为最终要求,用户需要从我的网站重定向到这个远程网站,就好像它已经在远程网站上提交了表单一样。
长话短说,我需要用户能够点击我的链接,让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());
}
到目前为止,我被重定向到form
所在的第一个网址,而不是form
应该导致的网址。该字段填充了正确的数据。
我的代码是否正确以实现我的目的(因此,它是可能使用JavaScript发送表单的远程网站或其他什么)或者我错过了一些相当明显的代码?
答案 0 :(得分:1)
Goutte基本上是针对Symfony\Browserkit
API的Guzzle适配器。基于对Goutte\Client
源代码的粗略分析,effectiveUrl()
未被使用或继承。这意味着如果发生了重定向,那么你就不会捡起它#34;。
使用以下代码片段,您可以使用基本组件(Guzzle,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);