【问题标题】:Send post request with same parameter names in Goutte在 Goutte 中发送具有相同参数名称的 post 请求
【发布时间】:2014-04-20 10:36:08
【问题描述】:

我正在抓取的一个网站对两个参数使用相同的名称,所以我想做这样的事情:

$params = array('dates' => '20140414', 'o' => '192382', 'o' => '213003' etc...);
$crawler = $client->request('POST', $url, $params);

但是,由于数组中不可能有两个相同的键,所以我遇到了问题。是否可以在 Goutte(Symfony 的 BrowserKit)中提出这样的请求?这是我想从 Chrome 的网络选项卡发出的确切请求的打印屏幕。

【问题讨论】:

    标签: php symfony httprequest goutte


    【解决方案1】:

    为了使用 Goutte(或 Guzzle,它有同样的问题)来执行此操作,您必须构建自己的表单 POST 请求,而不是使用 $formParameters。这需要手动设置 Content-Type 并将参数作为请求正文发送。

    假设您要发送以下参数:

    ['foo' => 1, 'bar' => 2, 'bar'=> 3, 'baz' => 4]
    

    这就是你的代码的样子

    $queryParams = [
        'foo=1',
        'bar=2',
        'bar=3',
        'baz=4',
    ];
    
    $content = implode('&', $queryParams);
    
    //This produces foo=1&bar=2&bar=3&baz=4
    
    /** @var Goutte\Client $client */
    $crawler = $client->request('POST', 'http://example.com/post.php', [], [], ['HTTP_CONTENT_TYPE' => 'application/x-www-form-urlencoded'], $content);
    

    注意参数和值必须是urlencoded。

    【讨论】:

    • 使用http_build_query($data)轻松构建表单编码表单数据
    • http_build_query() 在这种情况下不起作用。原因如下:3v4l.org/JB1TB
    • 哦,对不起,我看到我跳过了关于“相同参数名称”的点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2022-01-04
    • 2015-12-26
    • 2014-05-13
    • 2010-12-22
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多