wrapped ->$method($this->buildUrl($uri, $appendKey), ['form_params' => $params]) ->getBody(); if ($this->responseFormat === 'json') { return json_decode($body); } if ($this->responseFormat === 'xml') { return simplexml_load_string($body); } return $body; }); } public function requestAsync(string $method, string $uri, bool $appendKey = true, array $params = []): Promise { return $this->wrapped->$method($this->buildUrl($uri, $appendKey), ['form_params' => $params]); } /** * Make an HTTP call to the external resource. * * @param string $method The HTTP method * @param array $args An array of parameters * * @return mixed|SimpleXMLElement|void * @throws InvalidArgumentException * */ public function __call(string $method, array $args) // @phpcs:ignore { Assert::inArray($method, self::MAGIC_METHODS); if (count($args) < 1) { throw new InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; $params = $args[1] ?? []; $appendKey = $args[2] ?? true; if (Str::endsWith($method, 'Async')) { return $this->requestAsync($method, $uri, $appendKey, $params); } else { return $this->request($method, $uri, $appendKey, $params); } } /** * Turn a URI segment into a full API URL. * * @param bool $appendKey whether to automatically append the API key into the URL */ public function buildUrl(string $uri, bool $appendKey = true): string { if (!starts_with($uri, ['http://', 'https://'])) { if ($uri[0] !== '/') { $uri = "/$uri"; } $uri = $this->getEndpoint() . $uri; } if ($appendKey) { if (parse_url($uri, PHP_URL_QUERY)) { $uri .= "&$this->keyParam=" . $this->getKey(); } else { $uri .= "?$this->keyParam=" . $this->getKey(); } } return $uri; } abstract public function getKey(): ?string; abstract public function getSecret(): ?string; abstract public function getEndpoint(): ?string; }