James
James

Reputation: 16339

Learning how to access data from an API using Guzzle

I'm building a new application that requires the use of an API, in particular one that uses OAuth, but to begin with I'm trying to just use a simple API to wrap my head around how to use one in an application as I've never used an API before.

I'm running a fresh Laravel 5.1 project on my localhost with the Guzzle library installed.

Following the instructions from the Guzzle documentation, I believe I have set this up right, but I can't make heads or tales of the response I am getting.

The API I am trying to use is http://freegeoip.net/ and the format for making a request is freegeoip.net/{format}/{IP_or_hostname}.

I've set up a page where I can type in an IP address and submit this, to which it is then run by the following function in my controller:

public function retrieve(Request $request)
    {
        $url = "http://freegeoip.net/json/" . $request->ipaddress;
        $client = new Client();
        $response = $client->request('GET', $url);
        dd($response);
    }

My routes and everything are set up correctly, and I am referencing Guzzle at the top of my controller with:

use GuzzleHttp\Client;

But the response I get from dd($response); doesn't make any sense to me or give any hints as to how I could get any information from it.

This is what the dd($response) outputs

Response {#195 ▼
  -reasonPhrase: "OK"
  -statusCode: 200
  -headers: array:8 [▶]
  -headerLines: array:8 [▶]
  -protocol: "1.1"
  -stream: Stream {#186 ▶}
}

But when I run the equivalent URL through my browser I get

{"ip":"202.21.xxx.xxx","country_code":"NZ","country_name":"New Zealand","region_code":"WGN","region_name":"Wellington","city":"Wellington","zip_code":"6011","time_zone":"Pacific/Auckland","latitude":-41.283,"longitude":174.784,"metro_code":0}

Can anyone help out with what I'm doing wrong or point to some good resources on how to get started using APIs with Laravel. There's a lot on how to build a Laravel API but not how to access one from Laravel.

Upvotes: 2

Views: 2616

Answers (1)

James
James

Reputation: 16339

Well after a huge amount of digging, it turns out I was simply missing json_decode().

The request works fine when I run it like:

public function retrieve(Request $request)
    {
        $url = "http://freegeoip.net/json/" . $request->ipaddress;
        $client = new Client();
        $response = $client->request('GET', $url);
        dd(json_decode($response->getBody()));
    }

Answering this for anyone else who has trouble like this in the future :).

Upvotes: 4

Related Questions