Commit e0eac877 authored by 王源's avatar 王源
Browse files

调整shopify请求底层为curl模式

parent 1b9a982c
Loading
Loading
Loading
Loading
+115 −19
Original line number Diff line number Diff line
@@ -153,6 +153,95 @@ abstract class AbstractShopify
        return $resourceUrl . ($customAction ? "/$customAction" : '') . '.json' . (!empty($urlParams) ? '?' . http_build_query($urlParams) : '');
    }

//    /**
//     * @param array $urlParams
//     * @param null $url
//     * @param null $dataKey
//     * @return mixed
//     * @throws Exception
//     */
//    public function get($urlParams = [], $url = null, $dataKey = null)
//    {
//        if (!$url) $url = $this->generateUrl($urlParams);
//        $response = HttpRequestJson::get($url, $this->httpHeaders);
//        if (!$dataKey) $dataKey = $this->id ? $this->resourceKey : $this->pluralizeKey;
//        return $this->processResponse($response, $dataKey);
//    }
//
//    /**
//     * 根据id获取一条数据
//     * @param $id
//     * @param array $urlParams
//     * @return mixed
//     * @throws Exception
//     */
//    public function show($id, $urlParams = [])
//    {
//        $url = $this->generateUrl($urlParams, $id);
//        $response = HttpRequestJson::get($url, $this->httpHeaders);
//        return $this->processResponse($response, $this->resourceKey);
//    }
//
//    /**
//     * 获取数量
//     * @param array $urlParams
//     * @return mixed
//     * @throws Exception
//     */
//    public function count($urlParams = [])
//    {
//        if (!$this->countEnabled) {
//            throw new Exception("当前类{$this->getResourceName()}不支持count()方法");
//        }
//        $url = $this->generateUrl($urlParams, null, 'count');
//        return $this->get([], $url, 'count');
//    }
//
//    /**
//     * @param $dataArray
//     * @param null $url
//     * @param bool $wrapData
//     * @return mixed
//     * @throws Exception
//     */
//    public function post($dataArray, $url = null, $wrapData = true)
//    {
//        if (!$url) $url = $this->generateUrl();
//        if ($wrapData && !empty($dataArray)) $dataArray = $this->wrapData($dataArray);
//        $response = HttpRequestJson::post($url, $dataArray, $this->httpHeaders);
//        return $this->processResponse($response, $this->resourceKey);
//    }
//
//    /**
//     * @param int|string $id
//     * @param $dataArray
//     * @param null $url
//     * @param bool $wrapData
//     * @return mixed
//     * @throws Exception
//     */
//    public function put($id, $dataArray, $url = null, $wrapData = true)
//    {
//        if (!$url) $url = $this->generateUrl([], $id);
//        if ($wrapData && !empty($dataArray)) $dataArray = $this->wrapData($dataArray);
//        $response = HttpRequestJson::put($url, $dataArray, $this->httpHeaders);
//        return $this->processResponse($response, $this->resourceKey);
//    }
//
//    /**
//     * @param int|string $id
//     * @param array $urlParams
//     * @param null $url
//     * @return mixed
//     * @throws Exception
//     */
//    public function delete($id = null, $urlParams = [], $url = null)
//    {
//        if (!$url) $url = $this->generateUrl($urlParams, $id);
//        $response = HttpRequestJson::delete($url, $this->httpHeaders);
//        return $this->processResponse($response);
//    }

    /**
     * @param array $urlParams
     * @param null $url
@@ -196,21 +285,6 @@ abstract class AbstractShopify
        return $this->processResponse($response, $this->resourceKey);
    }

    /**
     * 获取数量
     * @param array $urlParams
     * @return mixed
     * @throws Exception
     */
    public function count($urlParams = [])
    {
        if (!$this->countEnabled) {
            throw new Exception("当前类{$this->getResourceName()}不支持count()方法");
        }
        $url = $this->generateUrl($urlParams, null, 'count');
        return $this->get([], $url, 'count');
    }

    /**
     * @param $dataArray
     * @param null $url
@@ -282,14 +356,36 @@ abstract class AbstractShopify
     * @return mixed
     * @throws Exception
     */
//    public function processResponse($response, $dataKey = null)
//    {
//        $httpCode = $response->getStatusCode();
//        $content = $response->getBody()->getContents();
//        $content = json_decode($content, true);
//
//        if (isset($content['errors'])) {
//            throw new Exception($this->castString($content['errors']), $httpCode);
//        }
//        if ($dataKey && isset($content[$dataKey])) {
//            return $content[$dataKey];
//        } else {
//            return $content;
//        }
//    }

    /**
     * 处理响应
     * @param array $response
     * @param null $dataKey
     * @return mixed
     * @throws Exception
     */
    public function processResponse($response, $dataKey = null)
    {
        $httpCode = $response->getStatusCode();
        $content = $response->getBody()->getContents();
        $content = json_decode($content, true);
        [$code, $header, $body] = $response;
        $content = json_decode($body, true);

        if (isset($content['errors'])) {
            throw new Exception($this->castString($content['errors']), $httpCode);
            throw new Exception($this->castString($content['errors']), $code);
        }
        if ($dataKey && isset($content[$dataKey])) {
            return $content[$dataKey];
+97 −0
Original line number Diff line number Diff line
<?php

namespace Meibuyu\Micro\Tools;

use Exception;

class CurlRequest
{

    protected static function init($url, $httpHeaders = [])
    {
        // Create Curl resource
        $ch = curl_init();

        // Set URL
        curl_setopt($ch, CURLOPT_URL, $url);

        //Return the transfer as a string
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, 'PHPClassic/PHPShopify');

        $headers = [];
        foreach ($httpHeaders as $key => $value) {
            $headers[] = "$key: $value";
        }
        //Set HTTP Headers
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        return $ch;

    }

    public static function get($url, $httpHeaders = [])
    {
        $ch = self::init($url, $httpHeaders);
        return self::processRequest($ch);
    }

    public static function post($url, $data, $httpHeaders = [])
    {
        $ch = self::init($url, $httpHeaders);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        return self::processRequest($ch);
    }

    public static function put($url, $data, $httpHeaders = [])
    {
        $ch = self::init($url, $httpHeaders);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        return self::processRequest($ch);
    }

    public static function delete($url, $httpHeaders = [])
    {
        $ch = self::init($url, $httpHeaders);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
        return self::processRequest($ch);
    }

    protected static function processRequest($ch)
    {
        # Check for 429 leaky bucket error
        while (1) {
            $output = curl_exec($ch);
            $response = new CurlResponse($output);

            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($httpCode != 429) {
                break;
            }

            $limitHeader = explode('/', $response->getHeader('X-Shopify-Shop-Api-Call-Limit'), 2);

            if (isset($limitHeader[1]) && $limitHeader[0] < $limitHeader[1]) {
                throw new Exception($response->getBody());
            }

            usleep(500000);
        }

        if (curl_errno($ch)) {
            throw new Exception(curl_errno($ch) . ' : ' . curl_error($ch));
        }

        // close curl resource to free up system resources
        curl_close($ch);

        $httpHeader = $response->getHeaders();

        return [$httpCode, $httpHeader, $response->getBody()];
    }

}
+75 −0
Original line number Diff line number Diff line
<?php

namespace Meibuyu\Micro\Tools;

class CurlResponse
{

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

    /** @var string */
    private $body;

    public function __construct($response)
    {
        $this->parse($response);
    }

    /**
     * @param string $response
     */
    private function parse($response)
    {
        $response = \explode("\r\n\r\n", $response);
        if (\count($response) > 1) {
            // We want the last two parts
            $response = \array_slice($response, -2, 2);
            list($headers, $body) = $response;
            foreach (\explode("\r\n", $headers) as $header) {
                $pair = \explode(': ', $header, 2);
                if (isset($pair[1])) {
                    $headerKey = strtolower($pair[0]);
                    $this->headers[$headerKey] = $pair[1];
                }
            }
        } else {
            $body = $response[0];
        }
        $this->body = $body;
    }

    /**
     * @return array
     */
    public function getHeaders()
    {
        return $this->headers;
    }

    /**
     * @param string $key
     *
     * @return string
     */
    public function getHeader($key)
    {
        return isset($this->headers[$key]) ? $this->headers[$key] : null;
    }

    /**
     * @return string
     */
    public function getBody()
    {
        return $this->body;
    }

    public function __toString()
    {
        $body = $this->getBody();
        $body = $body ?: '';
        return $body;
    }

}
+16 −15
Original line number Diff line number Diff line
@@ -19,14 +19,13 @@ namespace Meibuyu\Micro\Tools;
class HttpRequestJson
{

    protected static function prepareRequest($headers, $data = [])
    protected static function prepareRequest(&$headers = [], &$data = [])
    {
        $data = json_encode($data);
        if (!empty($data)) {
        if (!$data) {
            $headers['Content-type'] = 'application/json';
            $headers['Content-Length'] = strlen($data);
        }
        return [$headers, $data];
    }

//    /**
@@ -44,27 +43,27 @@ class HttpRequestJson
//    /**
//     * post请求
//     * @param $url
//     * @param $data
//     * @param $dataArray
//     * @param array $httpHeaders
//     * @return ResponseInterface
//     */
//    public static function post($url, $data, $httpHeaders = [])
//    public static function post($url, $dataArray, $httpHeaders = [])
//    {
//        $client = new Client(['timeout' => 30]);
//        return $client->post($url, ['headers' => $httpHeaders, 'json' => $data]);
//        return $client->post($url, ['headers' => $httpHeaders, 'json' => $dataArray]);
//    }
//
//    /**
//     * put请求
//     * @param $url
//     * @param $data
//     * @param $dataArray
//     * @param array $httpHeaders
//     * @return ResponseInterface
//     */
//    public static function put($url, $data, $httpHeaders = [])
//    public static function put($url, $dataArray, $httpHeaders = [])
//    {
//        $client = new Client(['timeout' => 30]);
//        return $client->put($url, ['headers' => $httpHeaders, 'json' => $data]);
//        return $client->put($url, ['headers' => $httpHeaders, 'json' => $dataArray]);
//    }
//
//    /**
@@ -87,20 +86,21 @@ class HttpRequestJson
     */
    public static function get($url, $headers = [])
    {
        self::prepareRequest($headers);
        return CurlRequest::get($url, $headers);
    }

    /**
     * post请求
     * @param $url
     * @param $data
     * @param $dataArray
     * @param array $headers
     * @return array
     */
    public static function post($url, $data, $headers = [])
    public static function post($url, $dataArray, $headers = [])
    {
        [$headers, $data] = self::prepareRequest($headers, $data);
        return CurlRequest::post($url, $data, $headers);
        self::prepareRequest($headers, $dataArray);
        return CurlRequest::post($url, $dataArray, $headers);
    }

    /**
@@ -112,8 +112,8 @@ class HttpRequestJson
     */
    public static function put($url, $data, $headers = [])
    {
        [$headers, $data] = self::prepareRequest($headers, $data);
        return CurlRequest::put($url, $data, $headers);
        self::prepareRequest($headers, $dataArray);
        return CurlRequest::put($url, $dataArray, $headers);
    }

    /**
@@ -124,6 +124,7 @@ class HttpRequestJson
     */
    public static function delete($url, $headers = [])
    {
        self::prepareRequest($headers);
        return CurlRequest::delete($url, $headers);
    }