Reputation: 873
This is probably the weirdest situation that I ever seen. Basically I have a system built in Laravel 5.1 which needs to make a request to an external system. The thing is, sometimes it works but sometimes I get
GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: hosthere
Absolutely nothing changes, in terms of code. I run the application with exactly the same parameters and sometimes I get the error, sometimes I get the right response.
Any ideas?
Thanks in advance
EDIT 2 When I execute nslookup domainthatineedtouse.com I get
;; Got SERVFAIL reply from 8.8.8.8, trying next server
Server: 8.8.4.4
Address: 8.8.4.4#53
Non-authoritative answer:
Name: domainthatineedtouse.com
Address: therealipaddressishere
Can this be related to the issue?
EDIT This is part of the class that is making the connection.
<?php
use GuzzleHttp\ClientInterface;
class MyClass
{
const ENDPOINT = 'http://example.com/v1/endpoint';
/**
* @var \GuzzleHttp\ClientInterface
*/
protected $client;
/**
* @var string The api key used to connect to the service
*/
protected $apiKey;
/**
* Constructor.
*
* @param $apiKey
* @param ClientInterface $client
*/
public function __construct($apiKey, ClientInterface $client)
{
$this->client = $client;
$this->apiKey = $apiKey;
}
/**
* Here is where I make the request
*
* @param $param1
* @param $param2
* @return \Psr\Http\Message\ResponseInterface
*/
public function makeTheRequest($param1, $param2)
{
return $this->client->request('get', self::ENDPOINT, [
'query' => [
'api_token' => $this->apiKey,
'parameter_1' => $param1,
'parameter_2' => $param2,
]
]);
}
}
Upvotes: 6
Views: 20250
Reputation: 873
I hope this helps. Basically the problem was related to the server:
https://twitter.com/digitalocean/status/844178536835551233
In my case, I just needed to reboot and everything seems fine now.
Upvotes: 0
Reputation: 6066
This is something one should always anticipate while calling external APIs most of them face outages including the very popular Amazon's Product Advertising API. So keeping that in mind this should always be placed in a try/catch along with using retries placed in a do/while.
You should always catch these two types of common timeouts, connection timeouts and request timeouts. \GuzzleHttp\Exception\ConnectException and \GuzzleHttp\Exception\RequestException
// query External API
// retry by using a do/while
$retry_count = 0;
do {
try {
$response = json_decode($this->external_service->runOperation($operation));
} catch (\GuzzleHttp\Exception\ConnectException $e) {
// log the error here
Log::Warning('guzzle_connect_exception', [
'url' => $this->request->fullUrl(),
'message' => $e->getMessage()
]);
} catch (\GuzzleHttp\Exception\RequestException $e) {
Log::Warning('guzzle_connection_timeout', [
'url' => $this->request->fullUrl(),
'message' => $e->getMessage()
]);
}
// Do max 5 attempts
if (++$retry_count == 5) {
break;
}
} while(!is_array($response));
Upvotes: 7
Reputation: 149
It could be helpful if you share actual code with us.
What I can say now, there are chances to be one of 2 issues:
a) DNS settings problem on your server. You need to try different configuration
b) you are passing http://
as part of the url.
Upvotes: 0