【问题标题】:Guzzle7 multipart/form-data POST not working correctlyGuzzle7 multipart/form-data POST 无法正常工作
【发布时间】:2021-02-01 17:52:58
【问题描述】:

我正在尝试重新创建提交表单。但由于某种原因,我的 POST 请求没有返回正确的页面。下面我包含了一个可以工作的原始 CURL 请求,然后是我的 Guzzle 代码,它不起作用。

我损坏的 Guzzle 代码和正常的 CURL 请求有什么区别?

我的 Guzzle 代码:

    $jar = new \GuzzleHttp\Cookie\CookieJar;

    $client = new \GuzzleHttp\Client([
        'base_uri' => 'https://www.southeastwater.co.uk',
        'cookies' => $jar,
    ]);
    $res = $client->request('GET', '/my-water-supply/my-water-looks-smells-strange/check-your-water-quality-hardness');

    $html = new \simplehtmldom\HtmlDocument($res->getBody());
    $form = $html->find('form.sewForm',1);
    foreach($form->find('input') as $n => $input){
        $x = [
            'name' => $input->name,
            'contents' => $input->value,
        ];
        $post[] = $x;

        if($n == 0){ // This is button field does just manually add it after the first input
            $post[] = [
                'name' => 'Jump',
                'contents' => '10',
            ];
        }
    }


    $post = [
        'multipart/form-data' => $post
    ];

    $res2 = $client->post('/my-water-supply/my-water-looks-smells-strange/check-your-water-quality-hardness', $post);
    echo $res2->getBody();
    // But body is wrong, it's shows HTML as if I had just refreshed the page and not submitted the POST at all.
    exit();

这是有效的 CURL 请求:

curl 'https://www.southeastwater.co.uk/my-water-supply/my-water-looks-smells-strange/check-your-water-quality-hardness' 
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0' 
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' 
-H 'Accept-Language: en-US,en;q=0.5' --compressed 
-H 'Content-Type: multipart/form-data; boundary=---------------------------18455269113520999061513576751' 
-H 'Origin: https://www.southeastwater.co.uk' 
-H 'Connection: keep-alive' 
-H 'Referer: https://www.southeastwater.co.uk/my-water-supply/my-water-looks-smells-strange/check-your-water-quality-hardness' 
-H 'Cookie: __RequestVerificationToken=Tnrx3xY2ia2Dk5fBdi16ppscN3_TeR67OLBDf8mz1WeYzUZIUPLRjXMDUZJbN7uH5oEGZOkDG-m_sf_8waTv3bxfYyEQjiBHSI2HeNFGMMM1' 
-H 'Upgrade-Insecure-Requests: 1' 
--data-binary $'-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="__RequestVerificationToken"\r\n\r\nnlEsW1Iccl9L3dc_gNgdRzKO0VKRQxxznr3WV8SiKixyRZRCnlAuvKAZZEvERfJP-Al8wldrb5vSTIbeeZMXh8LSPSy6gTX9bTmQONCKnzg1\r\n-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="Jump"\r\n\r\n10\r\n-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="WaterHardnessStep10_Postcode.Postcode"\r\n\r\n\r\n-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="WaterHardnessStep10_Postcode.ContactReason"\r\n\r\n\r\n-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="WaterHardnessStep10_Postcode.IsPostcodeInSupplyArea"\r\n\r\nFalse\r\n-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="WaterHardnessStep10_Postcode.SummaryHTML"\r\n\r\n\r\n-----------------------------18455269113520999061513576751\r\nContent-Disposition: form-data; name="ufprt"\r\n\r\n674979BCF955C16BD4492455228446D83AF77F393A0590F7C5DFEB8B23D87FC7F5657AB9254637877D139888488F106804F9982255BDCC1895FBD49330FB5DBC2BEB0F5F43ECBCDF1B5441ADAA5C8F5EBC1BBAB24EA9E7E0A21F3429BDB5264E425D439FAB6C4863B68120C0A90C3BF990A5D01CDBA3C88716BFDFF84EABE11F447DA1607D0E3FBF2A2890DFB2420C8C\r\n-----------------------------18455269113520999061513576751--\r\n'

【问题讨论】:

    标签: php web-crawler guzzle


    【解决方案1】:

    首先我觉得你正在获取一个 Cookie jar 实例但没有设置 cookie。

    $jar = new \GuzzleHttp\Cookie\CookieJar;
    $jar = \GuzzleHttp\Cookie\CookieJar::fromArray(
        [
            '__RequestVerificationToken' => 'your token ...'
        ],
        'https://www.southeastwater.co.uk'
    );
    $r = $client->request('GET', 'https://www.southeastwater.co.uk', [
        'cookies' => $jar
    ]);
    

    您还需要在 guzzle 的 multipart 键中将要发送的内容作为 multipart/form-data 发送。

    $res2 = $client->post('/my-water-supply/my-water-looks-smells-strange/check-your-water-quality-hardness', [
        'multipart' => $post
        ]
    ]);
        
    

    注意:

    我假设$post 是从这一步获得的。

    $post[] = [
                    'name' => 'Jump',
                    'contents' => '10',
                ];
    

    【讨论】:

    • 谢谢,原来我的问题是使用:$post = [ 'multipart/form-data' => $post ]; 而我应该一直使用:$post = [ 'multipart' => $post ];
    • 这就是我在回答Also you need to send the thing you want to send as multipart/form-data in multipart key in guzzle 中写的,见这一行
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2015-09-19
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多