Loading src/Shopify/lib/AbstractShopify.php +115 −19 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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]; Loading src/Tools/CurlRequest.php 0 → 100644 +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()]; } } src/Tools/CurlResponse.php 0 → 100644 +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; } } src/Tools/HttpRequestJson.php +16 −15 Original line number Diff line number Diff line Loading @@ -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]; } // /** Loading @@ -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]); // } // // /** Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -124,6 +124,7 @@ class HttpRequestJson */ public static function delete($url, $headers = []) { self::prepareRequest($headers); return CurlRequest::delete($url, $headers); } Loading Loading
src/Shopify/lib/AbstractShopify.php +115 −19 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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]; Loading
src/Tools/CurlRequest.php 0 → 100644 +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()]; } }
src/Tools/CurlResponse.php 0 → 100644 +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; } }
src/Tools/HttpRequestJson.php +16 −15 Original line number Diff line number Diff line Loading @@ -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]; } // /** Loading @@ -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]); // } // // /** Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -124,6 +124,7 @@ class HttpRequestJson */ public static function delete($url, $headers = []) { self::prepareRequest($headers); return CurlRequest::delete($url, $headers); } Loading