curl kopya kâğıdı: HTTP ve API için 40+ komut örneği
Bir staging makinesine üç SSH sıçraması derinliğindesiniz, bir API yanlış şeyi döndürüyor ve kurulu tek HTTP istemcisi curl. Ya da bir servisi sağlık kontrolünden geçiren bir CI betiğini okuyorsunuz ve -fsS’nin tam olarak ne yaptığını merak ediyorsunuz. Ya da bir mesai arkadaşınız Slack’e tek satırlık bir komut yapıştırdı ve siz onu kendi işinize uyarlamak istiyorsunuz. curl her yerde mevcut, ama flag’leri herkesin hepsini ezbere bileceğinden çok daha kısa ve çok daha fazla.
Bu kopya kâğıdı tam da bu anlar için. Önce her gün kullandığınız bir düzine kadar flag’i tek bir başvuru tablosunda topluyoruz, sonra her yaygın görevi kopyala-yapıştır komutlarla tek tek açıyoruz: GET ve POST istekleri, başlık gönderme, Bearer token ile kimlik doğrulama, dosya yükleme ve indirme, betiklerde API testi. Her komut gerçek ve çalıştırılabilir bir URL kullanır (httpbin.org ya da bir api.example.com yer tutucusu), yani doğrudan yapıştırıp deneyebilirsiniz. Anlatılan davranış resmi curl belgelerine ve güncel HTTP semantiği standardı RFC 9110’a dayanır.
Hızlı başvuru: gerçekten kullanacağınız curl flag’leri
Günlük curl kullanımının yaklaşık yüzde doksanı bu bir düzine flag’den ibarettir. Tabloyu yer imlerinize ekleyin; kılavuzun geri kalanı her birini çalıştırılabilir örneklerle açar.
| Flag | Anlamı | Örnek |
|---|---|---|
-X | HTTP metodunu ayarla | curl -X DELETE https://api.example.com/items/42 |
-H | İstek başlığı ekle (tekrarlanabilir) | curl -H "Accept: application/json" https://httpbin.org/get |
-d | İstek gövdesi gönder (POST’u ima eder) | curl -d "name=alice" https://httpbin.org/post |
--json | JSON gövdesi gönder + JSON başlıklarını ayarla | curl --json '{"id":1}' https://httpbin.org/post |
-F | Multipart form alanı / dosya gönder | curl -F "file=@report.pdf" https://httpbin.org/post |
-o | Çıktıyı belirtilen bir dosyaya kaydet | curl -o page.html https://example.com |
-O | Uzak dosya adıyla kaydet | curl -O https://example.com/archive.zip |
-L | Yönlendirmeleri takip et | curl -L https://httpbin.org/redirect/2 |
-u | Basic auth user:pass | curl -u alice:s3cret https://httpbin.org/basic-auth/alice/s3cret |
-i | Yanıt başlıklarını çıktıya dahil et | curl -i https://httpbin.org/get |
-I | Yalnızca başlıkları getir (HEAD) | curl -I https://example.com |
-v | Ayrıntılı: istek + TLS el sıkışmasını göster | curl -v https://example.com |
-s | Sessiz (ilerleme göstergesi yok) | curl -s https://httpbin.org/get |
-w | Aktarımdan sonra değişken yazdır | curl -s -o /dev/null -w "%{http_code}" https://example.com |
-b | cookie gönder (karakter dizisi veya dosya) | curl -b cookies.txt https://httpbin.org/cookies |
-c | Alınan cookie’leri bir kavanoza kaydet | curl -c cookies.txt https://httpbin.org/cookies/set/a/1 |
-k | TLS sertifika doğrulamasını atla | curl -k https://self-signed.example.com |
--http2 | HTTP/2 iste | curl --http2 https://example.com |
--http3 | HTTP/3 (QUIC) iste | curl --http3 https://example.com |
-T | PUT ile dosya yükle | curl -T backup.tar https://api.example.com/files/backup.tar |
--data-urlencode | Bir gövde alanını URL-kodla | curl --data-urlencode "q=hello world" https://httpbin.org/get -G |
--max-time | Tüm aktarımın süresini sınırlar (saniye) | curl --max-time 10 https://example.com |
--connect-timeout | Bağlantı kurulumunu sınırlar (saniye) | curl --connect-timeout 5 https://example.com |
--retry | Başarısız aktarımı N kez yeniden dener | curl --retry 3 https://example.com |
--limit-rate | Aktarım bant genişliğini sınırlar | curl --limit-rate 2M -O https://example.com/big.iso |
curl söz dizimi temelleri: bir isteğin anatomisi
Bir curl komutu ikili dosyadan, birkaç flag’den ve bir URL’den oluşur. URL flag’lerden önce de sonra da gelebilir; curl sırayı önemsemez. Önemsediği tek şey, hangi flag’lerin bir metodu ya da bir gövdeyi ima ettiğidir, çünkü bunlar birbirini etkiler.
Basit bir GET isteği
Metot flag’i olmadan curl bir GET gönderir. Komutun tamamı bu:
curl https://httpbin.org/get
httpbin isteğinizi JSON olarak geri yansıtır; test için bu yüzden çok kullanışlıdır. Bir sorgu dizesini tıpkı tarayıcıda yaptığınız gibi ekleyin:
curl "https://httpbin.org/get?page=2&sort=desc"
URL’yi tırnak içine alın. Tırnaksız bir & kabuğunuza komutu arka plana atmasını söyler ve sonrasındaki her şeyi sessizce düşürür. Bu, en sık yapılan curl hatalarından biridir; aşağıdaki tuzaklar bölümünde de ele alıyoruz.
Yanıtı görme: gövde, başlıklar, ikisi birden
curl varsayılan olarak yalnızca yanıt gövdesini yazdırır. Üç flag ne göreceğinizi değiştirir:
# Gövde + durum satırı + yanıt başlıkları
curl -i https://httpbin.org/get
# Yalnızca başlıklar — bir HEAD isteği gönderir, gövde yok
curl -I https://example.com
# Tam iz: istek satırı, istek başlıkları, TLS el sıkışması, yanıt
curl -v https://example.com
Gövdeyle birlikte Content-Type ya da Set-Cookie’ye hızlı bir göz atmak istediğinizde -i kullanın. Bir kaynağı indirmeden kontrol etmek için (dosya boyutu, son değişiklik tarihi, yönlendirme hedefi) -I kullanın. Bir şey ters gittiğinde ve curl’ün tam olarak ne gönderdiğini görmeniz gerektiğinde -v’ye başvurun.
Yönlendirmeleri takip etme
curl, siz istemediğiniz sürece yönlendirmeleri takip etmez. -L olmadan 301 veya 302 döndüren bir URL’ye gidin, hedefi değil yönlendirme yanıtının kendisini alırsınız:
# 302'de durur, işe yarar hiçbir şey yazdırmaz
curl https://httpbin.org/redirect/1
# Zinciri son 200'e kadar takip eder
curl -L https://httpbin.org/redirect/1
Bir isteğin sonunda nereye vardığından emin değilseniz, -IL her sıçramanın durum kodunu gösterir. Bu kodların ne anlama geldiğini, 301 ile 302’nin neden birbirinin yerine geçmediğini öğrenmek için HTTP durum kodları kopya kâğıdına bakın.
curl ile HTTP metotları (GET, POST, PUT, PATCH, DELETE)
curl metodu flag’lerinize bakarak kendisi seçer: -d ya da --json, POST demektir; tek başına bir URL ise GET demektir. -X’i yalnızca gönderdiğiniz gövdeyle örtüşmeyen bir metot gerektiğinde kullanın.
Sorgu parametreleriyle GET
Değerler boşluk ya da & içerdiğinde sorgu dizesini elle kurmak hataya açık bir iştir. -G flag’i curl’e --data-urlencode alanlarını düzgün kodlanmış bir sorgu dizesi olarak URL’nin sonuna eklemesini söyler:
curl -G https://httpbin.org/get \
--data-urlencode "q=hello world" \
--data-urlencode "tag=c++"
Bu komut ?q=hello%20world&tag=c%2B%2B üretir. Yüzde kodlamayı curl üstlendiği için bozuk bir URL göndermezsiniz.
POST: form verisi mi JSON mı
Bir curl post request çoğunlukla iki biçimde karşınıza çıkar. İlki form kodlu gövde (klasik HTML form gövdesi):
curl -d "name=alice&role=admin" https://httpbin.org/post
-d, Content-Type: application/x-www-form-urlencoded başlığını ayarlar ve metodu sizin yerinize POST’a çevirir. JSON tabanlı bir API içinse bunun yerine JSON gönderin:
curl -d '{"name":"alice","role":"admin"}' \
-H "Content-Type: application/json" \
https://httpbin.org/post
Bunun daha temiz bir yolu var; bir sonraki bölümde anlatıyoruz.
PUT ve PATCH
PUT bir kaynağın tamamını değiştirir; PATCH yalnızca bir kısmını günceller. PUT idempotenttir, yani aynı isteği iki kez göndermek sonucu değiştirmez.
# Kaynağın tamamını değiştir
curl -X PUT -d '{"name":"alice","role":"owner"}' \
-H "Content-Type: application/json" \
https://api.example.com/users/7
# Tek bir alanı güncelle
curl -X PATCH -d '{"role":"owner"}' \
-H "Content-Type: application/json" \
https://api.example.com/users/7
DELETE
DELETE genellikle gövde taşımaz, bu yüzden -X ihtiyacınız olan tek şey:
curl -X DELETE https://api.example.com/users/7
Başlık ve JSON gövdesi gönderme
Gerçek API işlerinin çoğu başlıklardan ve JSON’dan ibarettir. Bu yükün büyük kısmını iki flag taşır: -H ve --json.
-H ile özel curl başlıkları
-H tek bir başlık ekler ve ihtiyaç duydukça tekrarlayabilirsiniz. Accept, Authorization, özel X- başlıkları ve istek kimliklerini bu şekilde ayarlarsınız:
curl https://httpbin.org/headers \
-H "Accept: application/json" \
-H "X-Request-Id: 9f3c1a" \
-H "User-Agent: my-cli/1.0"
curl’ün normalde göndereceği bir varsayılan başlığı kaldırmak için ona boş değer verin (-H "User-Agent:"). Değeri olmayan bir başlık göndermek içinse noktalı virgül kullanın (-H "X-Empty;").
POST JSON: -d ile modern --json flag’i karşılaştırması
curl 7.82’den itibaren JSON bir curl post request göndermenin alışılmış yolu --json. Tek başına üç işi birden görür: Content-Type: application/json ayarlar, Accept: application/json ayarlar ve gövdeyi olduğu gibi gönderir.
# Ayrıntılı, eski yöntem — eşzamanlı tutulması gereken üç parça
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"alice"}' \
https://httpbin.org/post
# Modern karşılığı
curl --json '{"name":"alice"}' https://httpbin.org/post
--json’u birden çok kez geçebilirsiniz; curl parçaları birleştirir. --json @file.json ise gövdeyi bir dosyadan okur. JSON tabanlı her API’de bunu tercih edin.
Content-Type ve Accept
415 ve 406 hatalarının çoğu bu iki başlıktan kaynaklanır. Content-Type gönderdiğiniz gövdeyi tanımlar; Accept ise ne almak istediğinizi söyler. Yalnızca form verisi kabul eden bir endpoint’e JSON gönderirseniz 415 Unsupported Media Type alırsınız. Yalnızca JSON döndüren bir API’den XML isterseniz 406 Not Acceptable alabilirsiniz. (Bu kodları HTTP durum kodları kılavuzunda açıklıyoruz.)
Yanıt küçültülmüş tek satırlık bir JSON yığını halinde geldiğinde, onu JSON Biçimlendirici ile okunur hale getirin ya da tek bir alanı çekmek için doğrudan jq’ye yönlendirin:
curl -s https://httpbin.org/json | jq '.slideshow.title'
API yanıtlarını seçmek, eşlemek ve yeniden biçimlendirmek için jq filtrelerinin tam listesini jq komut satırı JSON kopya kâğıdında bulabilirsiniz.
curl ile kimlik doğrulama
Neredeyse her API dört kimlik doğrulama tarzından birine girer: basic auth, Bearer token’ları, API anahtarları ve cookie’ler.
Basic auth (-u user:pass)
-u, kimlik bilgilerinizi Base64 ile kodlayıp bir HTTP Authorization: Basic başlığında gönderir:
curl -u alice:s3cret https://httpbin.org/basic-auth/alice/s3cret
Parolayı yazmazsanız (-u alice), curl onu komut çalışırken sorar; böylece parola kabuk geçmişinize düşmez.
Bearer token’ları ve OAuth
Modern API’lerin çoğu bir curl bearer token kullanır: Authorization başlığına konan bir OAuth 2.0 erişim token’ı ya da API token’ı. curl’de bu başlığı elle yazmaya denk bir kısayol var: --oauth2-bearer:
# Açık başlık
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0In0.abc" \
https://api.example.com/me
# Kısayol
curl --oauth2-bearer "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0In0.abc" \
https://api.example.com/me
Arka uç token’ı reddederse, suçu curl’e atmadan önce token’ı JWT Çözücü ile çözüp exp (sona erme), aud (hedef kitle) ve iss (veren) talep alanlarını kontrol edin. Çoğu zaman sorun, süresi dolmuş ya da yanlış hedef kitleye düzenlenmiş bir token’dır.
API anahtarları (başlık mı sorgu parametresi mi)
Bazı API’ler anahtarı bir başlıkta, bazıları bir sorgu parametresinde bekler. Başlık kullanmak daha güvenlidir, çünkü URL’ler günlüklere ve tarayıcı geçmişine sızar:
# Tercih edilen: anahtar bir başlıkta
curl -H "X-API-Key: sk_live_a1b2c3" https://api.example.com/data
# Daha az güvenli: anahtar URL'de (erişim günlüklerine düşer)
curl "https://api.example.com/data?api_key=sk_live_a1b2c3"
Cookie’ler (göndermek için -b, kaydetmek için -c)
-c bir cookie kavanozu yazar; -b onu geri okur. Bir oturumu istekler arasında bu şekilde taşırsınız:
# Giriş yap ve oturum cookie'sini kaydet
curl -c jar.txt -d "user=alice&pass=s3cret" https://httpbin.org/cookies/set/session/abc123
# Bir sonraki çağrıda yeniden kullan
curl -b jar.txt https://httpbin.org/cookies
Güvenlik notu: token’lar ve kimlik bilgileri yalnızca HTTPS bağlantılarına gönderilmelidir; TLS başlıkları şifreler, düz HTTP şifrelemez. Gizli değerleri doğrudan komut satırına yazmaktan kaçının, çünkü orada hem kabuk geçmişinize hem de ps çıktısına düşerler. Başlığı -H @authfile ile bir dosyadan okuyun ya da değeri bir ortam değişkeninden çekin (-H "Authorization: Bearer $TOKEN").
Dosya indirme ve yükleme
curl’e “client URL” adı boşuna verilmedi; dosya taşımak onun asıl işidir. Hem indirmenin hem de yüklemenin bilmeye değer birkaç flag’i var.
İndirme: -O ile -o ile -C - karşılaştırması
-O (büyük O) dosyayı uzaktaki adıyla kaydeder. -o (küçük o) adı sizin seçmenize izin verir. -C - ise yarıda kalan bir indirmeyi kaldığı yerden sürdürür:
# Uzak dosya adıyla kaydet: archive.zip
curl -O https://example.com/downloads/archive.zip
# Seçtiğiniz bir adla kaydet
curl -o backup.zip https://example.com/downloads/archive.zip
# Kesintiye uğramış bir indirmeyi sürdür
curl -C - -O https://example.com/downloads/archive.zip
# Gerçek dosyaya kadar yönlendirmeleri takip et (CDN'lerde yaygın)
curl -OL https://example.com/latest/archive.zip
Bir yönlendirmenin arkasındaki içeriği curl download file ile indirmek için -L ekleyin; sürüm sayfaları ve CDN bağlantıları neredeyse her zaman yönlendirme yapar.
Yükleme: -T ile -F karşılaştırması
-T, bir dosyayı PUT ile yükler ve ham baytları gövde olarak gönderir; nesne depolamada ve REST dosya endpoint’lerinde sık görülür. -F ise tarayıcıların dosya girişleri için kullandığı biçimin aynısı olan bir multipart/form-data isteği gönderir:
# Ham baytları PUT et
curl -T report.pdf https://api.example.com/files/report.pdf
# multipart/form-data yüklemesi (@ önekine dikkat)
curl -F "file=@report.pdf" -F "title=Q2 report" https://httpbin.org/post
@ öneki curl’e dosyanın içeriğini okumasını söyler. Bu önek olmadan -F "file=report.pdf" dosyayı değil, report.pdf karakter dizisini olduğu gibi gönderir.
--data-urlencode ve yüzde-kodlama
Bir değer boşluk, &, = ya da ASCII dışı karakter içerdiğinde -d onu olduğu gibi gönderir ve isteğinizi bozar. --data-urlencode ise değeri doğru biçimde kodlar:
# Yanlış: & gövdeyi böler, boşluk geçersizdir
curl -d "q=hello world&filter=a&b" https://httpbin.org/post
# Doğru: her alan yüzde-kodlanır
curl --data-urlencode "q=hello world" \
--data-urlencode "filter=a&b" \
https://httpbin.org/post
O %20 ve %26 dizilerinin ne anlama geldiğini çözmeniz ya da çift kodlanmış bir değeri ayıklamanız gerekiyorsa, değeri URL Kodlayıcı ve Çözücü’ye yapıştırın ya da URL kodlama ve çözme kılavuzundaki bayt düzeyindeki adım adım açıklamayı okuyun.
API testi ve yanıtları inceleme
curl betiklerde ve CI’da işe yarar, çünkü -w aktarımla ilgili her şeyi açığa çıkarır ve çıkış kodları sayesinde başarısızlıkları yakalayabilirsiniz.
Yalnızca durum kodu
Yalnızca HTTP durumunu yakalamak için gövdeyi -o /dev/null ile atın ve kodu -w ile yazdırın:
curl -s -o /dev/null -w "%{http_code}\n" https://httpbin.org/status/204
# → 204
Bu komut, hemen her curl api testing sağlık kontrolünün temelidir. Geri aldığınız sayıyı yorumlamak için HTTP durum kodları kopya kâğıdı tüm aralıkları anlatıyor.
Zamanlama dökümü
-w zamanlama değişkenlerini de açığa çıkarır, böylece zamanın nereye gittiğini görürsünüz: DNS, TCP bağlantısı, TLS ya da sunucunun kendisi:
curl -s -o /dev/null \
-w "dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s\n" \
https://example.com
# → dns=0.004s connect=0.021s tls=0.058s total=0.142s
Yüksek bir time_appconnect değeri TLS’yi, yüksek bir time_starttransfer değeri ise yavaş bir arka ucu gösterir.
Sessiz ama hataları göster
-s ilerleme göstergesini gizler, ama hata mesajlarını da gizler; betiklerde işte bu bir tuzaktır. Onu -S ile eşleştirin, böylece curl başarıda sessiz kalır ama başarısızlıkları yine de bildirir:
curl -sS https://api.example.com/health
CI / betiklerde curl: HTTP hatalarında başarısız ol
curl varsayılan olarak 404 ya da 500 dönen bir istekte bile 0 ile çıkar, çünkü aktarımın kendisi başarılı olmuştur. Oysa bir sağlık kontrolünde tam tersini istersiniz. -f (fail) flag’i, curl’ün HTTP hatalarında sıfır dışı bir kodla çıkmasını sağlar, böylece boru hattınız bu hataları yakalar:
# Endpoint 4xx/5xx döndürürse derlemeyi başarısız kılar
curl -fsS https://api.example.com/health || exit 1
-fsS (fail, silent, show-errors) alışılmış sağlık kontrolü kombinasyonudur. Daha ayrıntılı tanılama isterseniz, --fail-with-body (curl 7.76+) çıkmadan önce hata yanıtını da yazdırır.
Zaman aşımları ve yeniden denemeler
Sonsuza dek takılı kalan bir health check, hızlıca başarısız olandan daha kötüdür. Betikteki her isteği --max-time (tüm aktarımın üst sınırı) ve --connect-timeout (yalnızca bağlantı kurulumunun üst sınırı) ile sınırlayın:
# 5 sn bağlantı, toplam 10 sn sonra vazgeç
curl --connect-timeout 5 --max-time 10 -fsS https://api.example.com/health
Kararsız bir ağda --retry, başarısız bir aktarımı üstel geri çekilmeyle yeniden dener. Varsayılan olarak yalnızca geçici hataları (zaman aşımları, 5xx) yeniden dener; reddedilen bağlantıları da denemek için --retry-all-errors ekleyin:
# Aralarında artan bir bekleme ile en fazla 3 deneme
curl --retry 3 --retry-all-errors --max-time 30 -fsS https://api.example.com/health
Bir betik büyük bir dosya çekerken bağlantıyı doyurmak istemiyorsanız --limit-rate bant genişliğini sınırlar — --limit-rate 2M onu 2 MB/s’de tutar.
curl ile HTTP/1.1, HTTP/2 ve HTTP/3
curl, HTTP sürümünü TLS üzerinden ALPN ile pazarlıkla belirler. Belirli bir protokol yolunu test etmeniz gerektiğindeyse bir sürümü zorlayabilirsiniz.
--http2 ve --http3
# HTTP/2 iste (mevcut değilse 1.1'e geri döner)
curl --http2 https://example.com
# QUIC üzerinden HTTP/3 iste
curl --http3 https://example.com
HTTP/3, QUIC üzerinden çalışır ve TLS 1.3 ister. Yalnızca curl’ünüz HTTP/3 destekli bir arka uçla derlenmişse ve sunucu onu bir Alt-Svc başlığıyla ilan ediyorsa çalışır. HTTP3’ün özellikler satırında olup olmadığını görmek için curl --version çalıştırın; satırda yoksa --http3 hata verir.
Ayrıntılı TLS / ALPN bilgisi
-v, pazarlıkla belirlenen protokolü ve TLS el sıkışmasını gösterir; bir sürümün gerçekten devreye girdiğini bu şekilde doğrularsınız:
curl -v --http2 https://example.com 2>&1 | grep -i "ALPN\|HTTP/2"
# → * ALPN: server accepted h2
# → > GET / HTTP/2
El sıkışması çıktısında ALPN: server accepted h2 (HTTP/2) ya da h3 (HTTP/3) satırını arayın.
8 yaygın curl tuzağı (ve nasıl düzeltilir)
Bu sekiz hata, er ya da geç hemen herkesi tökezletir.
-
Tek tırnak mı çift tırnak mı. Çift tırnaklar kabuğun
$VARSdeğişkenlerini genişletmesine izin verir; tek tırnaklar her şeyi olduğu gibi geçirir. JSON gövdelerinde tek tırnak kullanın ki$ve!yorumlanmasın:curl --json '{"price":"$5"}'. Genişletmeyi gerçekten istediğinizde çift tırnak kullanın:-H "Authorization: Bearer $TOKEN". -
-dURL kodlaması yapmaz. Bir-ddeğerindeki boşluk ya da&gövdeyi bozar. Henüz kodlanmamış her değer için--data-urlencode’a geçin. -
-dyanında gereksiz-X POST.-dzatenPOST’u ima eder.-X POST -d ...yazmak zararsız ama gereksizdir; dahası,-X GET -d ...bir GET ile gövde gönderir ki bu bazı sunucuları şaşırtır. Metodu gövde flag’inin belirlemesine izin verin. -
Dosyadan okurken
@’yi unutmak.-d @body.jsondosyayı okur;-d body.jsonisebody.jsonmetnini olduğu gibi gönderir. Aynı tuzak-F "file=@upload.png"ile-F "file=upload.png"arasında da geçerli. -
Sertifika hatalarında hemen
-k’ye sarılmak.-k, TLS doğrulamasını devre dışı bırakır ve gerçek sorunları gizler: süresi dolmuş sertifikalar, yanlış ana bilgisayar adı, eksik ara sertifika. Bunun yerine kök nedeni düzeltin; CA’yı--cacert ca.pemile yükleyin ya da sistem güven deponuzu güncelleyin.-k’yi yalnızca tamamen sizin kontrolünüzdeki kendinden imzalı bir geliştirme sunucusu için saklayın. -
-s’nin hataları yutması. Sessiz mod, betiklerdeki başarısızlıkları gizler. Hataların yine de görünmesi için her zaman-sSkullanın. -
URL’lerdeki
[]{}karakterlerinin glob’lanması. curl,[1-5]ve{a,b}ifadelerini URL aralığı ya da listesi sayar. Köşeli parantezi olduğu gibi içeren bir URL (arr[]=1gibi dizi sorgu parametrelerinde sık görülür) bu yüzden bozulur. Glob’lamayı-gile kapatın:curl -g "https://api.example.com/items?id[]=1&id[]=2". -
Başlık büyük/küçük harfi ve tekrarlar. HTTP başlık adları büyük/küçük harfe duyarsızdır, ama aynı başlığı iki kez göndermek çoğunlukla ikisini birden gönderir; kimi sunucu ilkini, kimi sonuncuyu alır, kimi de reddeder.
User-Agentgibi bir varsayılanı geçersiz kılıyorsanız, sıraya bel bağlamak yerine onu-Hile yalnızca bir kez ayarlayın.
curl, wget ve HTTPie karşılaştırması: hangisini kullanmalı
Üçü de HTTP üzerinden veri çeker, ama her biri farklı bir iş için tasarlanmıştır. curl vs wget kararı (HTTPie dahil) bir bakışta şöyle:
| Görev | curl | wget | HTTPie |
|---|---|---|---|
| Hızlı API çağrısı / hata ayıklama | Mükemmel | Sınırlı | Mükemmel |
| JSON gövdeleri | İyi (--json) | Hantal | Mükemmel (yerel) |
| Özyinelemeli site indirme / yansılama | Hayır | Mükemmel (-r) | Hayır |
| Büyük indirmeleri sürdürme + yeniden deneme | İyi (-C -) | Mükemmel (yerleşik) | Hayır |
Betikleme / CI (çıkış kodları, -w) | Mükemmel | İyi | İyi |
| Varsayılan olarak güzel, renklendirilmiş çıktı | Hayır | Hayır | Mükemmel |
| Neredeyse her yerde önceden kurulu | Evet | Sıkça | Nadiren |
Kısacası: API hata ayıklama ve betikler için curl’e başvurun, çünkü her yerde kurulu ve -w benzersiz bir şey sunuyor. Kendi makinenizde okunaklı JSON çıktısı istiyorsanız HTTPie kullanın. Siteleri yansılamak ya da otomatik yeniden denemelerle dosyaları toplu indirmek içinse wget en iyisi.
Sık sorulan sorular
curl ne için kullanılır?
curl, HTTP, HTTPS, FTP ve daha birçok protokol üzerinden bir sunucuya veri göndermek ve sunucudan veri almak için kullanılan bir komut satırı aracıdır. Geliştiriciler onu API çağırıp hata ayıklamak, dosya indirip yüklemek ve betiklerle CI boru hatlarında sağlık kontrolleri çalıştırmak için kullanır.
curl ile nasıl POST isteği gönderirim?
Form verisinde -d, JSON’da --json kullanın: curl --json '{"name":"alice"}' https://httpbin.org/post. İki flag de metodu kendiliğinden POST’a ayarlar, bu yüzden ayrıca -X POST yazmanıza gerek yoktur.
curl’de nasıl başlık eklerim?
-H "Name: value" kullanın ve birden çok başlık gerekiyorsa tekrarlayın: curl -H "Accept: application/json" -H "X-Request-Id: 9f3c1a" https://httpbin.org/headers. -H’yi istediğiniz kadar çok kez geçebilirsiniz.
curl ile nasıl Bearer token gönderirim?
Bir Authorization başlığı geçin: curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/me ya da kısayolu kullanın: --oauth2-bearer YOUR_TOKEN. Token’ları yalnızca HTTPS üzerinden gönderin ve hata ayıklarken JWT Çözücü ile çözün.
curl ile nasıl dosya indiririm?
Uzaktaki dosya adını korumak için -O, kendi adınızı vermek için -o name kullanın: curl -O https://example.com/archive.zip. Yönlendirmeleri takip etmek için -L, yarıda kalan bir indirmeyi sürdürmek için -C - ekleyin.
curl ile yalnızca HTTP durum kodunu nasıl görürüm?
Gövdeyi atın ve yalnızca kodu yazdırın: curl -s -o /dev/null -w "%{http_code}" https://example.com. Bu, betiklerdeki sağlık kontrolleri için alışılmış kalıptır.
curl ile wget arasındaki fark nedir?
curl tek bir kaynağı aktarır ve varsayılan olarak stdout’a yazar; bu yüzden API çağrıları ve betikleme için çok kullanışlıdır. wget ise indirmede uzmanlaşmıştır ve özyinelemeli yansılama ile otomatik yeniden denemeyi destekler. API testinde curl, toplu dosya indirmede wget kullanın.
curl Windows’ta mevcut mu?
Evet. curl, Windows 10 (build 1803+) ve Windows 11 ile birlikte gelir; Komut İstemi’nde ve PowerShell’de curl olarak çağrılır. Ancak PowerShell geçmişte curl’ü Invoke-WebRequest’e takma ad olarak atamıştı, bu yüzden flag’ler beklenmedik davranıyorsa curl.exe’yi açıkça çağırın.
Toparlarken
curl, küçük bir ezber çabasını fazlasıyla geri öder: en üstteki flag tablosu yazacaklarınızın büyük çoğunluğunu kapsar. Geri kalan iş, hangi flag’lerin bir metodu ima ettiğini, hangilerinin tırnak istediğini ve hangilerinin betiklerde size yalan söylediğini (özellikle tek başına -s) bilmektir. Bu kopya kâğıdını terminalinizin yanında açık tutun. Komutları görsel olarak oluşturmayı tercih ediyorsanız cURL komut oluşturucumuzu deneyin.
Bir API iş akışındaki sonraki adımlar bir tıklama ötede. İsteği curl ile gönderin, geri geleni HTTP durum kodları kopya kâğıdı ile okuyun, sonra JSON’u JSON Biçimlendirici ile okunur hale getirin ya da jq komut satırı JSON kopya kâğıdı ile parçalayın. Seçeneklerin tamamı için curl kılavuzu ayrıntılı bir kaynaktır; MDN’in HTTP başvurusu ise her metodun ve başlığın ardındaki semantiği açıklar.