账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    PHP GuzzleHttp 无法获取到返回结果
    45
    0
    $client = new GuzzleHttp\Client;
    $response = $client->request('POST', 'http://www.jgggbbs.cn/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LRTTI&inajax=1', array(
        'form_params' => array(
            'username'=>'test',
            'password'=>'fwefwegweg'
        ),
        'allow_redirects' => true,
        'headers' => [
            'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/61.0',
            'content-type' => 'application/x-www-form-urlencoded',
            'cache-control'      => 'no-cache'
        ]
    ));
    print_r($response->getBody()); //这里输出为空,无法获取到返回结果

    用PHP GuzzleHttp来登录某个论坛,这里先不管用户名和密码有没有错,也不管提交的参数有没有错,即使有错,网站也会返回出错的文字提示,但是现在我获取不到任何返回的文字,请问是怎么回事呢?

    下面是改用php curl来发送这请求,这个能获取到返回结果(同样先不管是否登录成功,只要有返回结果就行):

    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => "http://www.jgggbbs.cn/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LRTTI&inajax=1",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => "username=test&password=test",
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache",
        "content-type: application/x-www-form-urlencoded"
      ),
    ));
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
      echo "cURL Error #:" . $err;
    } else {
      echo $response; //这里能获取反返回结果
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 洒了囚心酒 普通会员 1楼

      在使用PHP GuzzleHttp库发送HTTP请求时,如果返回结果不是预设的类型(如JSON、XML、HTML等),可能会出现无法获取到返回结果的问题。以下是可能导致这个问题的一些常见原因和解决方法:

      1. 发送的请求类型不正确:在发送HTTP请求之前,确保你使用的URL是正确的,请求类型(GET、POST、PUT、DELETE等)和请求头(Content-Type、Authorization等)设置正确。在GuzzleHttp中,你可以使用GuzzleHttp\Request类的httpMethod()方法和httpHeader()方法来设置请求类型和头信息。

      ```php use GuzzleHttp\Request;

      $method = 'GET'; $headers = [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer YOUR_ACCESS_TOKEN', ];

      $curl = new Request($method, 'http://example.com/api/data', $headers); ```

      1. 请求头问题:在发送请求时,如果没有在请求头中设置相应的Authorization头信息,GuzzleHttp会默认使用HTTP Basic认证。如果你的服务器不允许使用Basic认证,你需要在请求头中设置相应的Authorization头信息,如Bearer token,例如:

      php $curl = new Request($method, 'http://example.com/api/data', [ 'Authorization' => 'Bearer YOUR_ACCESS_TOKEN', ]);

      1. 服务器返回的响应格式不正确:GuzzleHttp默认解析JSON响应,如果你的返回结果不是JSON格式,你需要在请求体中指定返回的响应格式。例如,如果你的返回结果是一个JSON数组,你可以使用json_encode()函数将数组转换为JSON格式:

      php $curl = new Request($method, 'http://example.com/api/data', [ 'Content-Type' => 'application/json', 'Body' => json_encode($yourArray), ]);

      1. 远程服务器响应问题:如果服务器响应超时,GuzzleHttp将抛出一个GuzzleHttp\Exception\RequestException异常。你可以使用response->getStatusCode()方法获取响应的HTTP状态码,然后在请求头中设置相应的状态码信息,如200表示成功,401表示未授权等:

      php $curl = new Request($method, 'http://example.com/api/data', [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer YOUR_ACCESS_TOKEN', 'StatusCode' => 200, ]);

      1. 其他异常或错误:如果请求中包含了非有效的参数或错误,GuzzleHttp将抛出一个GuzzleHttp\Exception\ClientException异常。你可以捕获这个异常并处理错误,例如:

      php try { $curl = new Request($method, 'http://example.com/api/data', [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer YOUR_ACCESS_TOKEN', ]); } catch (ClientException $e) { // 处理错误 }

      请注意,以上仅是一般性的解决方案,具体的解决方案可能取决于你的具体需求和服务器的响应格式。在实际使用中,可能需要根据服务器返回的响应内容和具体请求结构,进一步调用GuzzleHttp的错误处理函数,以获取更详细的错误信息和处理方式。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部