A simple way to call guzzle and cache data from API's

Parameters

ParameterExample value
client{ base_uri: 'https://api.myapi.com/' }
method'GET'
destination'v1/path'
headers{ headers: { 'client_id': 'your-id', 'client_secret': 'your-secret' }}
cache0

Usage

GET Json

{% set request = guzzle({
    base_uri : 'https://official-joke-api.appspot.com/'
}, 'GET', 'random_joke') %}

{% header "Content-Type: application/json; charset=utf-8" %}
{{ request|json_encode|raw }}

Result

{
    "type": "general",
    "setup": "Who is the coolest Doctor in the hospital?",
    "punchline": "The hip Doctor!",
    "id": 302
}

GET non-Json

Plugin will automatically return string if result can't be parsed as Json

{% set request = guzzle({
    base_uri : 'http://api.geonames.org/'
}, 'GET', 'srtm1?lat=50.01&lng=10.2&username=demo&style=full') %}

{{ request }}

Result

"208"

GET with Options

{% set request = guzzle({
    base_uri: 'https://currency-converter5.p.rapidapi.com/'
}, 'GET', 'currency/convert?from=USD&to=CAD&amount=1', {
    headers: {
        'X-RapidAPI-Key': 'you-api-key',
        'X-RapidAPI-Host': 'currency-converter5.p.rapidapi.com'
    }
}) %}

Result

{
    "base_currency_code": "USD",
    "base_currency_name": "United States dollar",
    "amount": "1.0000",
    "updated_date": "2023-04-19",
    "rates": {
        "CAD": {
            "currency_name": "Canadian dollar",
            "rate": "1.3443",
            "rate_for_amount": "1.3443"
        }
    },
    "status": "success"
}

GET with Caching

By default cache will be set to 0 meaning no caching unless you provide a cache duration in seconds. ex: 3600 = 1h , 86400 = 24h

{% set request = guzzle({
    base_uri : 'https://official-joke-api.appspot.com/'
}, 'GET', 'random_joke', {}, 3600) %}

{% header "Content-Type: application/json; charset=utf-8" %}
{{ request|json_encode|raw }}

POST with Bearer Auth

{% set request = guzzle({
    base_uri: 'https://api-ssl.bitly.com/'
}, 'POST', 'v4/bitlinks', {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer my-bearer-token'
    },
    body: '{
              "domain": "bit.ly",
              "long_url": "https://craftcms.com/"
           }'
}) %}

Result

{
    "created_at": "2023-04-20T00:10:44+0000",
    "id": "bitly.is/41no4QW",
    "link": "https://bitly.is/41no4QW",
    "custom_bitlinks": [],
    "long_url": "https://craftcms.com/",
    "archived": false,
    "tags": [],
    "deeplinks": [],
    "references": {
        "group": "https://api-ssl.bitly.com/v4/groups/Bi331psZCY8"
    }
}

POST with Basic Auth

{% set request = guzzle({
    base_uri: 'https://gtmetrix.com/api/2.0/'
}, 'POST', 'tests', {
    headers: {
        'Content-Type': 'application/vnd.api+json'
    },
    auth: ['my-auth', ''],
    body: '{
              "data": {
                  "type": "test",
                  "attributes": {
                      "url":      "https://craftcms.com"
                  }
              }
           }'
}) %}

Basic auth usually accepts username and password as parameters ex: auth: ['username', 'password'], in the example above the token is passed as username and pw is blank, per gtmetrix documentation.

Result

{
    "data": {
        "id": "tMsUIR0M",
        "type": "test",
        "attributes": {
            ...
        }
    },
    "meta": {
        "credits_left": 49,
        "credits_used": 1
    },
    "links": {
        "self": "https://gtmetrix.com/api/2.0/tests/tMsUIR0M"
    }
}

Twig Output

Making sure y'all understand how to output those results into your template.

{% set request = guzzle({
    base_uri: 'https://api.openai.com/v1/'
}, 'POST', 'completions', {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer my-bearer-token'
    },
    body: '{
              "model": "text-davinci-003",
              "prompt": "Hello, who are you?"
           }'
}) %}

Question: Hello, who are you?
Answer: {{ request.choices[0].text }}

Output

Question: Hello, who are you?
Answer: I'm Naveen. It's nice to meet you.

In the example above request outputs:

{
    "id": "cmpl-77BD86ixAzutOIdaOP6nNY98V5vSf",
    "object": "text_completion",
    "created": 1681945746,
    "model": "text-davinci-003",
    "choices": [
        {
            "text": "\n\nI'm Naveen. It's nice to meet you.",
            "index": 0,
            "logprobs": null,
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 6,
        "completion_tokens": 14,
        "total_tokens": 20
    }
}

Plus $5/year after one year.

Installation Instructions

To install this plugin, copy the command above to your terminal.

Active Installs
25
Version
1.0.1
License
Craft
Compatibility
Craft 4, Craft 5
Last release
May 13, 2023
Activity (30 days)
0
Closed Issues
0
Open Issues
0
Merged PRs
0
Open PRs