gpt4 book ai didi

php - 如何使用 Goutte 提交表单并获取最终 URI?

转载 作者:可可西里 更新时间:2023-10-31 23:39:46 24 4
gpt4 key购买 nike

目的是在远程网站上填充一个表单[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 所在的第一个 URL,而不是 form 应该指向的位置。不过,该字段填充了正确的数据。

我的代码是否正确以实现我的目的(因此,它是远程网站可能使用 JavaScript 发送表单或其他)还是我遗漏了一些相当明显的东西?

最佳答案

Goutte 基本上是 Guzzle 到 Symfony\Browserkit API 的适配器。根据对 Goutte\Client 源代码的粗略分析,effectiveUrl() 未被使用或继承。这意味着如果发生重定向,您将不会“捡起它”。

您可以使用以下代码片段使用基本组件(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);

关于php - 如何使用 Goutte 提交表单并获取最终 URI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29825925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com