Php GUZULE7多部分/表单数据POST工作不正常

Php GUZULE7多部分/表单数据POST工作不正常,php,web-crawler,guzzle,Php,Web Crawler,Guzzle,我正在尝试重新创建提交表单。但是由于某些原因,我的POST请求没有返回正确的页面。下面我包含了一个可以正常工作的原始卷曲请求,然后是无法正常工作的狂饮代码 我破碎的Guzzle代码和正在工作的CURL请求之间有什么区别 我的狂饮代码: $jar = new \GuzzleHttp\Cookie\CookieJar; $client = new \GuzzleHttp\Client([ 'base_uri' => 'https://www.southeast

我正在尝试重新创建提交表单。但是由于某些原因,我的POST请求没有返回正确的页面。下面我包含了一个可以正常工作的原始卷曲请求,然后是无法正常工作的狂饮代码

我破碎的Guzzle代码和正在工作的CURL请求之间有什么区别

我的狂饮代码:

    $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 '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'


首先,我觉得您正在使用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 key中以multipart/form数据的形式发送要发送的内容

$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/formdata'=>$post]$post=['multipart'=>$post]这是我在回答中写的
另外,您还需要在guzzle的multipart key中以multipart/form data的形式发送要发送的内容,请参见这一行