WordPress HTTP API

WordPress Uygulama Programlama Arayüzü (API) kullanımlarına dair yayınladığım WordPress API Kullanımları başlıklı yazının devamı ve bölümlerinden biri olan HTTP API ile ilgili detaylara geçebiliriz. Temel bir hatırlatmayla başlayalım1.

AA

WordPress HTTP API

WordPress HTTP API, her şeyi mümkün olduğunca basit bir şekilde ele alan tek bir API üzerinde standartlaştırma girişimidir ve WordPress 2.7 sürümünden bu yana kullanılabilmektedir. Nesne yönelimli (object-oriented) olan API, ayrıca API işlevlerinden faydalanmayı mümkün kılan yardımcı fonksiyonlara (helper functions) da sahiptir.

HTTP API Yardımcı Fonksiyonları (Helper Functions)

Developer Resources altından detaylarına ulaşabileceğimiz yardımcı fonksiyonlar şöyle:

  1. wp_remote_get() – Belirtilen URL aracılığıyla GET HTTP metotunu uygular.
  2. wp_remote_post() – Belirtilen URL aracılığıyla POST HTTP metotunu uygular.
  3. wp_remote_head() – Belirtilen URL aracılığıyla HEAD HTTP metotunu uygular.
  4. wp_remote_request() – Belirtilen URL aracılığıyla ön tanımlı olarak GET başta olmak üzere diğer HTTP metotlarının da uygulanabilmesini sağlar.
  5. wp_remote_retrieve_body() – Yanıt içerisinden sadece body’i alır.
  6. wp_remote_retrieve_header() – Yanıt içerisinden sadece ilgili HTTP header parçasını alır.
  7. wp_remote_retrieve_headers() – İşlem içerisindeki tüm HTTP header’i bir array olarak verir.
  8. wp_remote_retrieve_response_code() – HTTP yanıt değerini verir. Bu genellikle 200 olmalıdır. Ancak, olası başarısızlık durumlarında 4xx veya 3xx gibi değerler de dönebilir.
  9. wp_remote_retrieve_response_message() – Response code temel alarak response message döndürür.

wp_remote_get, wp_remote_post, wp_remote_head ve wp_remote_request yardımcı fonksiyonları bir hata olması durumunda WordPress WP_Error sınıfını döndürürler. Diğer fonksiyonlar ise cevabın farklı kısımlarını almakla ilgilenirler ve işlem aşamasında WP_Error testi yaparlar.

Hatırlatmalarımızı da yaptığımıza göre yardımcı fonksiyonları bir örnek akışı üzerinden incelemeye başlayabiliriz. Öncelikle, belirtmekte fayda var. İşlemleri functions.php dosyası üzerinden gerçekleştireceğim. Ancak bu bir zorunluluk değil. Bir plugin oluşturarak veya tema içerisindeki tanımlı veya özelleştirilmiş sayfaları da HTTP API testi için kullanabilirsiniz. Son olarak, HTTP API isteklerinde API Testing ve Fake API’ler başlıklı yazımda da bahsi geçmiş olan JSONPlaceholder‘dan faydalanacağım. wp_remote_get ile başlayalım.

wp_remote_get()

GET metotunu kullanarak ham HTTP request yanıtını alır. İki parametreye sahiptir; URL ya da endpoint ($url) ve argüman (argument) detaylarını ($args) alan dizi (array).

wp_remote_get(string $url, array $args = array())

Hemen fonksiyon aracılığıyla kısa örnek işlemler gerçekleştirelim.

$url = 'https://jsonplaceholder.typicode.com/todos/1/';
$response = wp_remote_get($url);
print_r($response);

Kodun uygulanmasının ardından bir dizi içerisinde headers, body, response, cookies, filename, header bilgisi, status_code, protokol ve benzeri pek çok bilgi dönecektir. Bizim için önemli olan alan ise bu bilgiler içerisinde yer alan body içeriği elbette.

[body] => {
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

Şimdi bir argüman kullanalım ve cevabı JSON formatında ([content-type] => application/json;) isteyelim.

$url = 'https://jsonplaceholder.typicode.com/todos/1/';
$args = array(
 'headers' => array( "Content-type" => "application/json" )
);
$response = wp_remote_get($url, $args);
print_r($response);

Edindiğimiz bu bilgileri daha önce de bahsi geçtiği üzere wp_remote_retrieve_body, wp_remote_retrieve_headers, wp_remote_retrieve_header, wp_remote_retrieve_response_code yardımcı fonksiyonları ile ayrıştırabilmekteydik. O halde body içeriğini alalım.

$url = 'https://jsonplaceholder.typicode.com/todos/1/';
$args = array(
 'headers' => array( "Content-type" => "application/json" )
);
$response = wp_remote_get($url, $args);
$body = wp_remote_retrieve_body($response);
print_r($body);

Görüldüğü üzere, bu özelleştirme ile sadece body içeriği dönecektir.

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

Aynı işlemi wp_remote_retrieve_headers ile tekrarlayabilirsiniz. Ben yine response header‘i bud efa spesifik bir değeri (örn. content-type) edinmek için kullanacağım. Hatta, bu işlemi bir condition ile ilişkilendirelim ve wp_remote_retrieve_response_code ile response code 200 ise sonucun görüntülenmesini isteyelim.

$url = 'https://jsonplaceholder.typicode.com/todos/1/';
$response = wp_remote_get($url);
$response_header =  wp_remote_retrieve_header($response, 'content-type');
echo wp_remote_retrieve_response_code($response) == 200 ? $response_header : 'Error!';

Yukarıdaki kodun dönüşü şu şekilde olacaktır:

application/json; charset=utf-8

wp_remote_post()

HTTP POST metotunu kullanarak verileri uzak bir adrese gönderebiliriz. wp_remote_post, bu işlem için iki parametreye ihtiyaç duyar. URL ya da endpoint ($url) ve argüman (argument) detaylarını ($args) alan dizi (array). Yine yukarıdaki örnek akışı üzerinden ilerleyelim ve todo list’e yeni bir madde ekleyelim.

$url = 'https://jsonplaceholder.typicode.com/todos/';
$args = array(
 'body' => array(
  "userId" => 1,
  "title" => "Rise and shine!",
  "completed" => false
 )
);

$response = wp_remote_post($url, $args);
print_r(wp_remote_retrieve_body($response));

Yukarıdaki kodu uygulamamızın ardından şu dönüşü alırız.

{
  "userId": "1",
  "title": "Rise and shine!",
  "completed": "0",
  "id": 201
}

wp_remote_head()

HEAD metotunu kullanarak da veri gönderme işlemi gerçekleştirebiliriz.

$url = 'https://jsonplaceholder.typicode.com/todos/';
$args = array(
 'body' => array(
  "userId" => 111,
  "title" => "Rise and shine!",
   "completed" => false
 )
);

$response = wp_remote_head($url, $args);
echo wp_remote_retrieve_response_message($response);

Yukarıdaki kod içeriğindeki veri ilk defa gönderildiğinde Created, var olan bir veri ise OK dönüşü alınacaktır2.

wp_remote_request()

wp_remote_request bize GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE gibi HTTP request’leri kullanma imkanı sağlar. Elbette bu isteğin başarıyla gerçekleştirilebilmesi için sunucunun bu isteğe karşılık vermesi gerekiyor. İlgili fonksiyon ön tanımlı olarak -herhangi bir method belirtilmemişse- GET request’i kullanmakta.

$url = 'https://jsonplaceholder.typicode.com/todos/';
$args = array(
 'method' => 'POST',
 'body' => array(
  "userId" => 131,
  "title" => "Smile!",
   "completed" => false
 )
);

$response = wp_remote_request($url, $args);
echo wp_remote_retrieve_body($response);
echo wp_remote_retrieve_response_message($response);

Yukarıdaki kod uygulandığında ilgili data todo list’e eklenecek;

{
  "userId": "131",
  "title": "Smile",
  "completed": "0",
  "id": 201
}

wp_remote_retrieve_response_message Created mesajını döndürecektir. Şimdi DELETE ile eklediğimiz bu yeni kaydı silelim.

$url = 'https://jsonplaceholder.typicode.com/todos/201';
$args = array(
 'method' => 'DELETE',
);

$response = wp_remote_request($url, $args);
echo wp_remote_retrieve_response_message($response);

Evet, örnek işlemlerimiz bu kadar. Daha detaylı bilgiler için WP_Http2 bağlantısını tekrar hatırlatarak yazıyı sonlandırabiliriz.

İleri Okumalar

  1. Using wp_remote_get() to parse JSON from remote APIs
  2. Basic Authentication with the WordPress HTTP API