Doküman

Örneklerle Curl Komutu Temelleri

Curl, HTTP, HTTPS, FTP, FTP, SFTP gibi desteklenen birçok protokolden birini kullanarak sunucularla veri alışverişi yapmak için kullanabileceğimiz ücretsiz ve açık kaynaklı bir yazılımdır. Curl bir komut satırı aracı olduğundan, örneğin tekrarlayan görevleri otomatikleştirmek için komut dosyalarımızda kullanabiliriz. Curl’in kapsayabileceği birçok kullanım durumu vardır. Ancak bu yazıda, en yaygın olanlardan bazılarını görüyoruz.

Aşağıda, temel GET ve POST isteklerini gerçekleştirmek için Curl’ün nasıl kullanılacağını ve bir isteğin başlık parametrelerinin nasıl ayarlanacağını göreceğiz.

Bu eğitimde şunları öğreneceksiniz:

  • En çok kullanılan Linux dağıtımlarından bazılarına Curl nasıl kurulur?
  • Curl ile GET ve POST istekleri nasıl yapılır
  • Curl ile bir POST isteğinde JSON ve XML verileri nasıl gönderilir
  • Curl ile bir istek başlığı parametreleri nasıl ayarlanır

Kurulum

Curl, github üzerinde geliştirilmiş ücretsiz ve açık kaynaklı bir yazılımdır. En yaygın Linux dağıtımlarının tümünün depolarında bulunur ve muhtemelen sisteminizde zaten kurulu olduğunu göreceksiniz. Ancak açıkça yüklemeniz gerekirse, bu talimatları takip edebilirsiniz.

Curl’i Fedora’ya yüklemek için:

$ sudo dnf install curl

Paketi Ubuntu, Debian ve diğer Debian tabanlı dağıtımlara kurmak için bunun yerine aşağıdaki komutu başlatabiliriz:

$ sudo apt-get update && sudo apt-get install curl

Curl is also available in the “Core” Archlinux repository. From there, we can install it by running:

$ sudo pacman -Sy curl

GET isteklerini gerçekleştirme

GET http yöntemi, bir sunucudan kaynakları almak için kullanılır. Tarayıcımızdan bir web sayfası istediğimizde veya bir dosya indirdiğimizde bu yöntemden yararlanıyoruz. Bu tür istekleri Curl ile gerçekleştirmek oldukça kolay bir işlemdir. Aşağıdaki örnekte https://www.google.com sayfasını istiyoruz:

$ curl https://www.google.com

Bu şekilde çağrıldığında curl, sunucu tarafından gönderilen yanıtın gövdesini standart çıktıya yazdırır. Bu durumda aldığımız içerik, sayfanın HTML kodudur. İçerik standart çıktıda gönderildiğinden, onu başka bir komuta girdi olarak beslemek ve daha fazla işleyip işlemek için bir pipe kullanabiliriz. Önceki örnekte istek tarafından döndürülen sayfanın kaynak kodunda “google” kelimesinin kaç kez göründüğünü saymak istediğimizi varsayalım:

$ curl -s https://www.google.com | grep -i -o google | wc -w
85

Yukarıdaki örnekte Curl’u çağırdık ve ‘-s’ parametresini kullandık: bu, ‘–silent’ın kısaltmasıdır ve Curl davranışını, istek için ilerleme sayacını görüntülemeyecek şekilde değiştirir. Söylediğimiz gibi, yanıtın gövdesi standart çıktı dosyası tanımlayıcısına gönderilir, bu nedenle | yeniden yönlendirme operatörü (bir boru), onu standart girdi olarak -i parametresiyle çağırdığımız grep’e geçirmek, büyük/küçük harfe duyarsız hale getirmek ve -o ile bir satırın yalnızca eşleşen kısmını göstermesini sağlamak için (bu durumda kelimenin bulunduğu satırın tamamı yerine yalnızca “google” dünyasını gösterecektir). Son olarak, grep tarafından üretilen çıktıyı, word sayısını döndüren wc -w komutuna gönderiyoruz.

Dosya indirme

Curl, dosyaları indirmek için de kullanılabilir. Söylediğimiz gibi, bir yanıtın gövdesi standart çıktıda görüntülendiğinden, dosya sistemimizde bir dosya olarak kaydedilmesini istediğimizi belirtmemiz gerekiyor, aksi takdirde terminalimizde anlamsız görürüz. Bu gibi durumlarda -o parametresini ( –output’un kısaltması) kullanabilir ve argüman olarak yerel dosya için kullanılacak adı sağlayabiliriz. Mozilla resmi sitesinden Firefox’un en son sürümünü indirmek istediğimizi varsayalım. Tarball’ı yerel olarak firefox.tar.bz2 olarak kaydetmek için aşağıdaki komutu çalıştırırız:

$ curl \
  --output firefox.tar.gz \
  https://download-installer.cdn.mozilla.net/pub/firefox/releases/106.0.1/linux-x86_64/en-US/firefox-106.0.1.tar.bz2

Dikkat edilmesi gereken önemli bir nokta, kabuğun olası özel karakterleri yorumlamasını önlemek için URL’yi alıntılamış olmamızdır. Komutu başlattığımız anda, indirme işlemi ekranda görüntülenecektir:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   137  100   137    0     0    176      0 --:--:-- --:--:-- --:--:--   176
 87 75.1M   87 65.6M    0     0  1486k      0  0:00:51  0:00:45  0:00:06 1454k^C

–output seçeneğine alternatif olarak –remote-name veya -O kullanabiliriz. Bu, dosyanın bu durumda uzak adı firefox-106.0.1.tar.bz2 ile kaydedilmesine neden olur:

$ curl \
  --remote-name \
  'https://download-installer.cdn.mozilla.net/pub/firefox/releases/106.0.1/linux-x86_64/en-US/firefox-106.0.1.tar.bz2'

POST isteklerini gerçekleştirme

POST http yöntemi, bir sunucuda yeni kaynaklar oluşturmak için kullanılır. Bir POST istekleri genellikle farklı şekillerde gönderilebilen verileri içerir. Hadi bazı örneklere bakalım.

application/x-www-form-urlencoded içerik türünü kullanma

Curl ile bir POST isteğine veri eklemenin en basit yolu –data parametresini (-d) veya –data-urlencode’u kullanmaktır. Gönderdiğimiz veriler urlencoding (yüzde kodlamalı) olmalıdır. İlkini kullanırsak, onu önceden kodlamamız gerekir; ikincisini kullanırsak (Curl’un son sürümlerinde bulunur), bunun yerine veriler bizim için otomatik olarak kodlanır:

curl \
  --data-urlencode "name=John Smith" \
  --data-urlencode "age=30" \
  https://httpbin.org/post

Yukarıda gördüğünüz gibi bir istek yaptığımızda, Content-Type parametresinin değeri olarak request başlığında x-www-form-urlencoded otomatik olarak ayarlanır. Yukarıdaki örnekte, istekleri test etmek için kullanılabilecek https://httpbin.org sitesine isteği gönderdik. Sunucu, istekte gönderilen verileri yansıtan bir yanıt döndürür:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "30", 
    "name": "John Smith"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "22", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.82.0", 
    "X-Amzn-Trace-Id": "Root=1-6356ba6c-325eb51e69a7a95021ee6249"
  }, 
  "json": null, 
  "origin": "xxx.xxx.x.xx", 
  "url": "https://httpbin.org/post"
}

JSON veya XML verilerini gönderme

Bazı durumlarda veri olarak bir JSON dizisi göndermemiz gerekebilir. Bu gibi durumlarda iki şey yapmamız gerekir:

  • İçerik Türü başlık parametresini açıkça application/json olarak ayarlayın
  • JSON dizesini –data parametresinin argümanı olarak iletin.

İşte böyle bir istek örneği:

$ curl \
  --header "Content-Type: application/json" \
  --data '{"name": "John Smith", "age": 30 }' \
  https://httpbin.org/post

XML verilerini göndermek istediğimizde de aynı ilke uygulanmalıdır, örneğin:

$ curl \
  --header "Content-Type: text/xml" \
  --data '<person><name>John Smith</name><age>30</age></person>' \
  https://httpbin.org/post

Çok parçalı/form-veri içerik türünü kullanma

Bir POST isteği yapmak ve multipart/form-data içerik türünü kullanarak veri eklemek için Curl’i –form (-F) parametresiyle çalıştırabiliriz. Bu, örneğin bir dosya yüklememiz gerektiğinde kullanmak istediğimiz şeydir. İşte önceki örnekte yaptığımız, ancak bu içerik türüyle gerçekleştirdiğimiz aynı istek:

$ curl \
  --form "name=John Smith" \
  --form "age=30" \
   https://httpbin.org/post

Ve işte sunucu tarafından gönderilen karşılık gelen yanıt:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "30", 
    "name": "John Smith"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "243", 
    "Content-Type": "multipart/form-data; boundary=------------------------e231a6560f5118bd", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.82.0", 
    "X-Amzn-Trace-Id": "Root=1-6356c1d1-05e70c5919d0971a3bd299e6"
  }, 
  "json": null, 
  "origin": "xxx.xx.x.xx", 
  "url": "https://httpbin.org/post"
}

İsteğin bir parçası olarak, çalışma dizinimizde mevcut olan ve “profil” alanıyla ilişkili bir resmi yüklemek istediğimizi varsayalım. İşte çalıştıracağımız komut:

curl \
  --form "name=John Smith" \
  --form "age=30" \
  --form "[email protected]" \
  https://httpbin.org/post


Fark edebileceğiniz gibi, mutlak veya göreceli olabilen görüntünün yolunu takip eden @ sembolünü kullandık. İsteği gerçekleştirdiğimizde sunucu bu yanıtı döndürür. Yüklediğimiz dosyanın, karşılık gelen form alanıyla ilişkili yanıtın “dosyalar” bölümünde olduğuna dikkat edin (kolaylık olması açısından çok uzun değeri atlamak için […] gösterimini kullandım):

{
  "args": {}, 
  "data": "", 
  "files": {
    "profile-picture": "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAADwAAAAhwCAYAAACQvstyAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9btVoqIu0g4pChOlkQFXHUKhShQqgVWnUwufRDaNKQpLg4Cq4FBz8Wqw4uzro6uAqC[...]"
  }, 
  "form": {
    "age": "30", 
    "name": "John Smith"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "153871", 
    "Content-Type": "multipart/form-data; boundary=------------------------94b6dea0b7f448d5", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.82.0", 
    "X-Amzn-Trace-Id": "Root=1-6356c368-2f39e19a67106e4141410178"
  }, 
  "json": null, 
  "origin": "xxx.xx.x.xx", 
  "url": "https://httpbin.org/post"
}

Bir dosyanın içeriğini gönderme

Curl, dosyayı yüklemek yerine dosyanın içeriğini almak için kullanabileceğimiz özel bir sözdizimi sağlar. Örneğin, mevcut çalışma dizinimizde name.txt dosyasında adımızın kayıtlı olduğunu varsayalım. İçeriğini “ad” form alanının değeri olarak iletmek için < sembolünü aşağıdaki şekilde kullanırdık:

curl --form "name=<name.txt" https://httpbin.org/post

Dosyanın tüm içeriğinin, yeni satır karakterleri dahil alan değeri olarak kullanılacağına dikkat edin.

İstek Başlıklarını Ayarlama

Başlık parametreleri, bir isteğe ek bilgi sağlamak için kullanılır: bazı örnekler, bir bağlantının ne kadar açık kalması gerektiğini kontrol etmek için kullanılan Canlı Tut veya uygulama ve işletim sistemi türünü tanımlamak için kullanılan Kullanıcı Aracısı veya Kabul Et’tir. , istemci tarafından hangi MIME türlerinin kabul edildiğini belirtmek için kullanılır. Başlık parametrelerini Curl ile ayarlamak için -H seçeneğini kullanabiliriz (–header’ın kısaltması):

$ curl \
  --header "Accept: text/xml" \
  --header "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:105.0) Gecko/20100101 Firefox/105.0" \
   https://httpbin.org/get

Bu arada, bir isteğin Kullanıcı aracısını ayarlamak için Curl, –user-agent seçeneği (-A) aracılığıyla bir kısayol sağlar:

$ curl --user-agent "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:105.0) Gecko/20100101 Firefox/105.0" https://httpbin.org/get

Yazının orijinalini buradan okuyabilirsiniz.