当前位置: 首页 > 知识库问答 >
问题:

拉拉维尔·古兹尔 - cURL 错误 3: (见 https://curl.haxx.se/libcurl/c/libcurl-errors.html)

焦博实
2023-03-14

我围绕 Shopify 的 REST API(使用基本身份验证的私有应用程序)创建了一个简单的包装器,就像使用 Guzzle 一样:

<?php

namespace App\Services;

use stdClass;
use Exception;
use GuzzleHttp\Client as GuzzleClient;

/**
 * Class ShopifyService
 * @package App\Services
 */
class ShopifyService
{
    /**
     * @var array $config
     */
    private $config = [];

    /**
     * @var GuzzleClient$guzzleClient
     */
    private $guzzleClient;

    /**
     * ShopifyService constructor.
     */
    public function __construct()
    {
        $this->config = config('shopify');
    }

    /**
     * @return ShopifyService
     */
    public function Retail(): ShopifyService
    {
        return $this->initGuzzleClient(__FUNCTION__);
    }

    /**
     * @return ShopifyService
     */
    public function Trade(): ShopifyService
    {
        return $this->initGuzzleClient(__FUNCTION__);
    }

    /**
     * @param string $uri
     * @return stdClass
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @throws Exception
     */
    public function Get(string $uri): stdClass
    {
        $this->checkIfGuzzleClientInitiated();;
        $result = $this->guzzleClient->request('GET', $uri);
        return \GuzzleHttp\json_decode($result->getBody());
    }

    /**
     * @throws Exception
     */
    private function checkIfGuzzleClientInitiated(): void
    {
        if (!$this->guzzleClient) {
            throw new Exception('Guzzle Client Not Initiated');
        }
    }

    /**
     * @param string $storeName
     * @return ShopifyService
     */
    private function initGuzzleClient(string $storeName): ShopifyService
    {
        if (!$this->guzzleClient) {
            $this->guzzleClient = new GuzzleClient([
                'base_url' => $this->config[$storeName]['baseUrl'],
                'auth' => [
                    $this->config[$storeName]['username'],
                    $this->config[$storeName]['password'],
                ],
                'timeout' => 30,
            ]);
        }

        return $this;
    }
}

配置/商店在哪里.php看起来像这样:

<?php

use Constants\System;

return [

    System::STORE_RETAIL => [
        'baseUrl' => env('SHOPIFY_API_RETAIL_BASE_URL'),
        'username' => env('SHOPIFY_API_RETAIL_USERNAME'),
        'password' => env('SHOPIFY_API_RETAIL_PASSWORD'),
    ],

    System::STORE_TRADE => [
        'baseUrl' => env('SHOPIFY_API_TRADE_BASE_URL'),
        'username' => env('SHOPIFY_API_TRADE_USERNAME'),
        'password' => env('SHOPIFY_API_TRADE_PASSWORD'),
    ],

];

当我这样使用服务时:

    $retailShopifySerice = app()->make(\App\Services\ShopifyService::class);

    dd($retailShopifySerice->Retail()->Get('/products/1234567890.json'));

我收到以下错误:

guzzle http \ Exception \ request Exception cURL错误3:(参见https://curl.haxx.se/libcurl/c/libcurl-errors.html)

如您所见,我正在制作一个简单的带有默认选项的http客户端(用于基本uri基本身份验证)并提出后续GET请求。

这在理论上应该可以,但是我想不通它为什么会抛出这个错误?

我已经验证了配置是正确的(即它具有我期望的值),并尝试清除所有laravel缓存

知道这里可能出了什么问题吗?

共有1个答案

陆洲
2023-03-14

由于某种原因,我无法使用base_url选项来处理Guzzle\Client

<?php

namespace App\Services;

use Exception;
use App\DTOs\ShopifyResult;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Exception\GuzzleException;

/**
 * Class ShopifyService
 * @package App\Services
 */
class ShopifyService
{
    const REQUEST_TYPE_GET = 'GET';
    const REQUEST_TYPE_POST = 'POST';
    const REQUEST_TIMEOUT = 30;

    /**
     * @var array $shopifyConfig
     */
    private $shopifyConfig = [];

    /**
     * ShopifyService constructor.
     */
    public function __construct()
    {
        $this->shopifyConfig = config('shopify');
    }

    /**
     * @param string $storeName
     * @param string $requestUri
     * @return ShopifyResult
     * @throws GuzzleException
     */
    public function Get(string $storeName, string $requestUri): ShopifyResult
    {
        return $this->guzzleRequest(
            self::REQUEST_TYPE_GET,
            $storeName,
            $requestUri
        );
    }

    /**
     * @param string $storeName
     * @param string $requestUri
     * @param array $requestPayload
     * @return ShopifyResult
     * @throws GuzzleException
     */
    public function Post(string $storeName, string $requestUri, array $requestPayload = []): ShopifyResult
    {
        return $this->guzzleRequest(
            self::REQUEST_TYPE_POST,
            $storeName,
            $requestUri,
            $requestPayload
        );
    }

    /**
     * @param string $requestType
     * @param string $storeName
     * @param $requestUri
     * @param array $requestPayload
     * @return ShopifyResult
     * @throws GuzzleException
     * @throws Exception
     */
    private function guzzleRequest(string $requestType, string $storeName, $requestUri, array $requestPayload = []): ShopifyResult
    {
        $this->validateShopifyConfig($storeName);

        $guzzleClient = new GuzzleClient();

        $requestOptions = [
            'auth' => [
                $this->shopifyConfig[$storeName]['username'],
                $this->shopifyConfig[$storeName]['password']
            ],
            'timeout' => self::REQUEST_TIMEOUT,
        ];

        if (count($requestPayload)) {
            $requestOptions['json'] = $requestPayload;
        }

        $response = $guzzleClient->request(
            $requestType,
            $this->shopifyConfig[$storeName]['baseUrl'] . $requestUri,
            $requestOptions
        );

        list ($usedApiCall, $totalApiCallAllowed) = explode(
            '/',
            $response->getHeader('X-Shopify-Shop-Api-Call-Limit')[0]
        );

        $shopifyResult = new ShopifyResult(
            $response->getStatusCode(),
            $response->getReasonPhrase(),
            ((int) $totalApiCallAllowed - (int) $usedApiCall),
            \GuzzleHttp\json_decode($response->getBody()->getContents())
        );

        $guzzleClient = null;
        unset($guzzleClient);

        return $shopifyResult;
    }

    /**
     * @param string $storeName
     * @throws Exception
     */
    private function validateShopifyConfig(string $storeName): void
    {
        if (!array_key_exists($storeName, $this->shopifyConfig)) {
            throw new Exception("Invalid shopify store {$storeName}");
        }

        foreach (['baseUrl', 'username', 'password'] as $configFieldName) {
            if (!array_key_exists($configFieldName, $this->shopifyConfig[$storeName])) {
                throw new Exception("Shopify config missing {$configFieldName} for store {$storeName}");
            }
        }
    }
}

 类似资料:
  • 所以我正在尝试为我的网站实现一个支付解决方案,经过相当多的研究,我仍然缺乏一个完整的解决方案。我正在运行Laravel 5.0,需要一般购物车付款功能。我想我会发布这篇文章,试图创建一个参考,以帮助其他可能有这个问题的人。我已经把测试事务放到了Paypal的沙箱中,这似乎是砖墙的所在,但是一个完整的概述会很有帮助。我将列出我需要克服的问题,以便解决一些问题。 完成支付解决方案实施需要解决的问题 >

  • 我在本地运行的Laravel应用程序中有一个登录页面,但在生产服务器上,我收到以下错误消息(Laravel.log) 在应用/存储/视图/8d74d14da5e7fbd7b4984adefddd5a1b中生成的代码是: 有什么想法吗? 谢谢你

  • 基本上,我试图在用户、post和回复数据库之间建立一种关系。以下是模型:注释模型 答复方式: 主要代码: 当我进入评论页面时,我得到以下错误: 未定义的属性:照亮\数据库\雄辩\关系\属于::$name。 这是我第一次使用关系,所以我查看了Laravel文档,但仍然不知道我做错了什么。基本上,我试图从用户数据库中获取用户名(使用comments user_id作为外键),获取评论详细信息(body

  • 我在localhost登录Facebook时收到此错误: cURL错误60:SSL证书问题:无法获取本地颁发者证书(请参阅http://curl.haxx.se/libcurl/c/libcurl-errors.html)

  • 我试着向Github API发出一个API请求,只是为了测试。我在我的Laravel 5.1应用程序上安装了最新的Guzzle版本(“guzzle/guzzle”:“^3.9”)。在我的< code>routes.php中,我有以下代码: 如果我现在访问URLdomain.dev/github/kayyyy我得到错误。 为什么我会收到此错误? 如果我访问https://api.github.com

  • 我有点困惑于认识到和包之间的差异。它们实际上通过令牌服务于相同的API身份验证目的吗?只要Laravel Pasport是在5.3中引入的,在最新版本中是否应该使用Pasport而不是包?