Liman MYS üzerinde API kullanımı
Tags: guzzle, php, api
Published: 2021-08-13 13:42:49

# Public API Kullanım Örneği 

Bu yazıda public bir API'nin Liman eklentisinde nasıl kullanılabileceğinden bahsedeceğim.

Kodlara linkten ulaşabilirsiniz. https://github.com/abugraokkali/Liman-Covid-Stats



- **app/Controllers/ApiController.php**

  ```php
  use GuzzleHttp\Client;
  ```

  İlk olarak dosyamızda GuzzleHttp\Client kullanacağımızı belirtiyoruz.

  Guzzle, HTTP isteklerini göndermeyi ve web servisleriyle entegre olmayı kolaylaştıran bir PHP HTTP istemcisidir. Özet bir bilgiye gist yazımdan ulaşabilirsiniz.

  https://gist.github.com/abugraokkali/8d99177a7af4daa62b2d63e3941fdd88

  ```php
  public function getResponse()
  {
  	$client = new GuzzleHttp\Client(
  		['base_uri' => 'https://api.covid19api.com/']
  	);
  	$response = $client->request('GET', 'summary');
  	return json_decode($response->getBody()->getContents());
  	
  }
  ```

   Base URI'yı  https://api.covid19api.com/  olan bir GuzzleHttp\Client objesi oluşturuyoruz. Request'lerimizi bu client üzerinden yapacağız.

  Client nesnesinin request methoduyla /summary enpoint'ine GET sorgusu yapıyoruz. JSON formatındaki response'unu decode edip return ediyoruz.

  

  Request : GET https://api.covid19api.com/summary

  Response :

  ```json
  {
    "ID": "17cf60ab-05a9-4a5d-8027-458354300853",
    "Message": "",
    "Global": {
      "NewConfirmed": 306062,
      "TotalConfirmed": 205102230,
      "NewDeaths": 3858,
      "TotalDeaths": 4331537,
      "NewRecovered": 0,
      "TotalRecovered": 0,
      "Date": "2021-08-13T07:08:37.28Z"
    },
    "Countries": [
      ...
      {
        "ID": "b1cecf17-faac-4e60-b5e3-9266759234a6",
        "Country": "Turkey",
        "CountryCode": "TR",
        "Slug": "turkey",
        "NewConfirmed": 0,
        "TotalConfirmed": 6018455,
        "NewDeaths": 0,
        "TotalDeaths": 52703,
        "NewRecovered": 0,
        "TotalRecovered": 0,
        "Date": "2021-08-13T07:08:37.28Z",
        "Premium": {}
      },
      ...
     ],
    "Date": "2021-08-13T07:08:37.28Z"
   }
  ```

  

  ```php
  public function listCountries()
  {
      $response = $this->getResponse();
      $countries = (array) $response->{'Countries'};
      $data = [];
  	foreach($countries as $country){
   		$data[] = [
   			"Country" => $country->{'Country'},
  			"CountryCode" => $country->{'CountryCode'},
  			"TotalConfirmed" => $country->{'TotalConfirmed'},
  			"TotalDeaths" => $country->{'TotalDeaths'},
  		];
  	}
  	return view('table', [
  		"value" => $data,
  		"title" => ["Ülke","Ülke Kodu","Vaka Sayısı","Vefat Sayısı"],
  		"display" => ["Country","CountryCode","TotalConfirmed","TotalDeaths"]
  	]);
  
  }
  ```

  Bu fonksiyon getResponse()'un çağrılıp verinin istenen formata dönüştürülmesi işini yapıyor.

  Özetle; 

  -  getResponse() çağırılıyor,
  -  getResponse()'un return ettiği response'un {'Countries'} attribute'u alınıyor ve array haline getiriliyor,

  - array üzerinden for-loop  ile geçiliyor ve istenen attribute'lar data adında bir array'de tutuluyor,
  - data array'i view'e parametre olarak verilip 

return ediliyor.

- **routes.php**

```php
<?php
return [
  ...
  "list_countries" => "ApiController@listCountries",
  ...
];
```

- **views/countries/main.blade**

```html
<div class="row">
    <div class="col-12 mb-2">
        <div class="table-responsive" id="countriesTable"></div>
    </div>
</div>

@include("countries.scripts")
```

Tablo için bir div oluşturuyoruz.

- **views/countries/scripts.blade**

```javascript
<script>
    function listCountries(){
        showSwal("{{__('Yükleniyor...')}}", 'info');
        let data = new FormData();
        request("{{API('list_countries')}}", data, function(response){
 	 		$('#countriesTable').html(response).find('table').DataTable(
            												  dataTablePresets('normal');
            Swal.close();
        }, function(response){
            response = JSON.parse(response);
            showSwal(response.message, 'error');
        });
    }
</script>
```

Return edilen view'i oluşturduğumuz div'e koyuyoruz ve tabloyu bastırmış oluyoruz.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8t48b80x6g9s87x20r0.png)