CURL ile POST İsteği

Curl aracı ile POST isteği gönderirken kullanmamız gereken bazı parametreler var. Bunlar -X, -H, -d ve --data-urlencode parametreleri. Ayrıca Webhook entegrasyonu oluşturma bölümünde not aldığımız Webhook URL’ini de bu aşamada CURL aracına girmemiz gerekiyor. Şimdi bu parametrelere ve kodumuzun değişen yapısına bakalım.

-X veya - -request

Bu parametre ile verimizin hangi yöntemle gönderileceğini belirliyoruz. Slack Incoming Webhooks POST yöntemini desteklediği için -X POST parametresini Curl komutuna dahil etmemiz gerekiyor. Bu parametre yerine --request de kullanabilirsiniz(Örn: --request POST). İki parametre de aynı işlemi yapacaktır. Parametreyi Curl aracına aşağıdaki gibi tanımlıyoruz.

$ curl -X POST

veya

$ curl --request POST

Ancak komut bu şekilde çalışmayacaktır. Curl, URL’in belirtilmediğine dair bir hata mesajı döndürür. Ayrıca mesaj verimizi de eklemeliyiz.

-H veya - -header

POST ile veri gönderirken kullanacağımız içerik türünü bu parametreler ile belirliyoruz. Slack platformunun desteklediği iki içerik türü var.

  • application/json
  • application/x-www-form-urlencoded

Bu türlerden birini, veriyi gönderirken -H veya --header parametrelerini kullanarak belirtmemiz gerekiyor. Bu parametrelerden birini ve hemen ardından formatımızı yazarak Curl aracına aşağıdaki gibi tanımlıyoruz.

curl -X POST -H "Content-type: application/json"

Veya application/x-www-form-urlencoded formatı için komutu aşağıdaki gibi yazıyoruz.

curl -X POST -H "Content-type: application/x-www-form-urlencoded"

-d veya - -data

Göndereceğimiz verileri belirttiğimiz parametredir.

Sunucuya POST ile gönderilen veriler, HTTP istek gövdesinde saklanır. Bizim gönderdiğimiz veri ise JSON yapısında. Ayrıca mesajınızda daha zengin içerikler sunabilmeniz için, üzerinde link ve button gibi HTML form verilerinin eklenmesi de sağlanmış. Bu tür veriler sunucuya gönderilmeden önce URL kodlaması (yüzde kodlaması) denilen bir yöntemle kodlanıyor. URL kodlaması, bir URL’deki ?, / ve = gibi özel karakterleri %3F, %2F ve %3D gibi kodlara dönüştürür. Bu kodlama işlemi belirsizliği ortadan kaldırıyor.

Bu parametre ile girilen veriler ise kodlanmaz. Eğer verilerimizi göndereceğimiz API, veriyi kodlamamızı zorunlu kılıyorsa, bu parametreye gireceğimiz verinin daha önceden kodlamasının yapılmış olaması gerekiyor. Eğer kodlama gerektirmeyen veya doğrudan JSON formatlı verileri göndermek istiyorsak, bu parametre ile kodlamadan gönderebiliyoruz.

Son oluşturduğumuz mesaj bloğumuz aşağıdaki gibiydi. JSON yapısını payload parametresine eklemiştik.

payload = {
   "username": "firat",
   "channel": "#tasarım",
   "icon_emoji": ":ghost:",
   "text":"Bu bir deneme mesajıdır.\nBu cümle ise ikinci satıra yazılır. <https://example.com/|Buraya tıklayın.>"
}

Eğer verimizi application/json formatında göndermek isteseydik, payload parametresini çıkartmamız, istek yöntemini ve veri formatımızı da aşağıdaki gibi belirtmemiz gerekecekti.

curl -X POST -H "Content-type: application/json"
--data "{
   "username": "firat",
   "channel": "#tasarım",
   "icon_emoji": ":ghost:",
   "text":"Bu bir deneme mesajıdır.\nBu cümle ise ikinci satıra yazılır. <https://example.com/|Buraya tıklayın.>"}"

Ancak biz verimizi daha önce kodlamadığımız ve kodlama işleminin Curl tarafından yapılmasını istediğimiz için, -d veya --data parametresini kullanmayacağız. HTML-form tipindeki özel karakterleri de taşıyabileceğimiz application/x-www-form-urlencoded formatını kullanacağız ve Curl’in --data-urlencode parametresini kullanarak, payload anahtarına yükleyerek göndereceğiz.

- -data-urlencode

Eğer URL kodlama işlemini önceden yapmış olsaydık, --data, --data-binary gibi parametrelerle veriyi gönderebilirdik. Ancak bizim göndereceğimiz veri daha önceden kodlanmadığı için --data-urlencode parametresi ile veri içeriğimizin Curl tarafından kodlanmasını sağlayabiliyoruz.

HTML-form tipinde özel karakter içerme potansiyeli olan verimizi, aşağıdaki gibi application/x-www-form-urlencoded formatıyla belirterek oluşturabiliriz.

curl -X POST -H "Content-type: application/x-www-form-urlencoded"
--data-urlencode "payload = {
   "username": "firat",
   "channel": "#tasarım",
   "icon_emoji": ":ghost:",
   "text":"Bu bir deneme mesajıdır.\nBu cümle ise ikinci satıra yazılır. <https://example.com/|Buraya tıklayın.>" }"

Görüldüğü gibi -X parametresi ile gönderim yöntemini, -H parametresi ile de verimizin formatını belirtiyoruz. Eğer herhangi bir veri formatı belirtilmezse Curl veriyi ön tanımlı olarak application/x-www-form-urlencoded olarak kabul ediyor. Dolayısıyla, eğer HTML-form tipinde karakterlerin bulunduğu bir veri gönderiyorsak, ayrıca bir de -H parametresi ile format belirtmemize gerek kalmıyor. Yani komutumuzdan -H parametresini ve içerdiği değeri çıkartarak aşağıdaki gibi yazdığımızda da amacımıza ulaşmış oluyoruz.

curl -X POST
--data-urlencode "payload = {
   "username": "firat",
   "channel": "#tasarım",
   "icon_emoji": ":ghost:",
   "text":"Bu bir deneme mesajıdır.\nBu cümle ise ikinci satıra yazılır. <https://example.com/|Buraya tıklayın.>" }"

Öneri: Slack, yukarıda bahsedilen iki formatı da kabul ediyor ve ikisi ile de nasıl gönderim yapılabileceğine dair bilgileri sayfalarında bulabilirsiniz. Fakat amacınız komut satırını kullanarak gönderim yapmaksa, ek URL kodlaması gerektirmeyen ve daha kısa olan ikinci yöntemi seçmemiz daha mantıklı olacaktır.

Son parametre olarak da, daha önce yedeklediğimiz Webhook Url değerimizi Curl aracına giriyoruz.

Bütün bu işlemlerden sonra kod yapımızın son halini aşağıda görebilirsiniz.

curl -X POST
--data-urlencode "payload = {
   "username": "firat",
   "channel": "#tasarım",
   "icon_emoji": ":ghost:",
   "text":"Bu bir deneme mesajıdır.\nBu cümle ise ikinci satıra yazılır. <https://example.com/|Buraya tıklayın.>" }"
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

Mesaj gönderme işlemini komut satırından yapacağımız için kod üzerinde karışıklıkları önlemek adına yapmamız gereken bazı eklemeler var. Bunları bir sonraki Komut Satırından Mesaj Gönderme konusu altında bulabilirsiniz.