cURL错误6:无法解析主机 - Guzzle

时间:2017-10-31 18:21:25

标签: php laravel curl laravel-5.1 guzzle

描述

guzzle 6.3版

如果我在课堂上有这个

课程CURL {

public static function get($url) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //<------ Note HERE 
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    $result =  json_decode($result, true);
    return $result;

}

如果我在课堂上有这个

尝试#1

<?php
namespace App;

use Request,Auth;
use App\Log, App\Helper;

use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;

use GuzzleHttp\FORCE_IP_RESOLVE;
use GuzzleHttp\DECODE_CONTENT;
use GuzzleHttp\CONNECT_TIMEOUT;
use GuzzleHttp\READ_TIMEOUT;
use GuzzleHttp\TIMEOUT;

use GuzzleHttp\VERIFY;



class CURL {

    $client = new Client();
    $options = [
        'http_errors' => false,
        'force_ip_resolve' => 'v4',
        'connect_timeout' => 10,
        'read_timeout' => 10,
        'timeout' => 10,
        'verify' => false
    ];
    $result = $client->request('GET',$url,$options);
    $result = json_decode((string) $result->getBody(), true);
    return $result;
    ...

}

如您所见,我已尝试设置'verify' => false

我得到了

enter image description here

尝试#2

添加'curl' => [ CURLOPT_SSL_VERIFYPEER => false ]

    $client = new Client();
    $options = [
        'http_errors' => false,
        'force_ip_resolve' => 'v4',
        'connect_timeout' => 10,
        'read_timeout' => 10,
        'timeout' => 10,
        'verify' => false,
        'curl' => [ CURLOPT_SSL_VERIFYPEER => false ]
    ];
    $result = $client->request('GET',$url,$options);
    $result = json_decode((string) $result->getBody(), true);
    return $result;

我得到了

enter image description here

尝试#3

删除'force_ip_resolve' => 'v4',

    $client = new Client();
    $options = [
        'http_errors' => false,
        'connect_timeout' => 10,
        'read_timeout' => 10,
        'timeout' => 10,
        'verify' => false
    ];
    $result = $client->request('GET',$url,$options);
    $result = json_decode((string) $result->getBody(), true);
    return $result;

我得到了

enter image description here

尝试#4

添加此行$result = $result->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, FALSE);

    $client = new Client();
    $options = [
        'http_errors' => false,
        'force_ip_resolve' => 'v4',
        'connect_timeout' => 10,
        'read_timeout' => 10,
        'timeout' => 10,
        'verify' => false
    ];
    $result = $client->request('GET',$url,$options);
    $result = $result->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, FALSE);
    $result = json_decode((string) $result->getBody(), true);
    return $result;

我得到了

  

调用未定义的方法GuzzleHttp \ Psr7 \ Response :: getCurlOptions()

问题

如何继续进行调试?

我现在可以接受任何建议。

任何提示/建议/帮助都将非常感谢!

3 个答案:

答案 0 :(得分:1)

这里的问题是$ url不是一个有效的url,事实上,你的$ url变量似乎包含html。然后你告诉curl连接到...这个html,作为一个网址,curl说它无法找到该域名。尝试提供一个有效的网址(例如,hhtp://example.org)作为$ url参数,它应该可以正常工作。

答案 1 :(得分:1)

这里的问题是您尝试在响应上设置验证选项,至少对于您的第三个示例

您可以在guzzle中禁用ssl验证,如下所示:

$client->getHttpClient()->setDefaultOption('verify', false); - 实际上,你已经拥有了,所以从理论上讲,你甚至不需要这条线:

$result = $result->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, FALSE);

对于#2,curl表示您将页面的HTML传递给get方法,而不是URL,因此未知主机错误。

您还在响应正文中调用json_decode,这不是文本,您需要$response->getBody()->getContents();,就像这样

public static function get($url){
    $options = [
        'http_errors' => false,
        'force_ip_resolve' => 'v4',
        'connect_timeout' => 10,
        'read_timeout' => 10,
        'timeout' => 10,
        'verify' => false
    ];
    $client = new Client($options);
    $result = $client->request('GET',$url);
    $result = json_decode($result->getBody()->getContents(), true);
    return $result;
}

答案 2 :(得分:1)

你在所有Guzzle的例子中都有'force_ip_resolve' => 'v4',,但cURL示例没有相同的选项。尝试删除它,除非你真的需要它。