Curl kullanarak bir dizi ile json nesnesi nasıl eklenir


97

Veritabanına girmem gereken bir dizi veri var. Verileri girmek için kullanılan kullanıcı arayüzü toplu giriş için iyi değildir, bu yüzden bir komut satırı eşdeğeri formüle etmeye çalışıyorum. UI'nin ağ isteğini Chrome'da incelediğimde, bir json nesnesinin PUT isteğini görüyorum. İsteği kopyalamaya çalıştığımda

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

Hata alıyorum

curl: (3) [globbing] yuvalanmış kaşlı ayraçlar konum X'te desteklenmiyor

X, ilk "[" karakterinin konumudur.

Dizi içeren bir json nesnesini nasıl PUT yapabilirim?

Yanıtlar:


151

Komut satırınızda , PUT'ta göndermek istediğiniz dizeden önce bir -d / - verisi eklenmelidir ve İçerik Türü'nü ayarlamak ve Kabul Etmek istemiyorsunuz.

curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' \
     http://example.com/service

Sorudaki tam JSON verilerini kullanarak tam komut satırı şöyle olur:

curl -H 'Content-Type: application/json' -X PUT \
    -d '{"tags":["tag1","tag2"],
         "question":"Which band?",
         "answers":[{"id":"a0","answer":"Answer1"},
                    {"id":"a1","answer":"answer2"}]}' \
    http://example.com/service

Not: JSON verileri yalnızca okunabilirlik için sarılır, curlistek için geçerli değildir .


4
-1 çünkü Content-Type (Accept yerine) bu durumda ayarlanması gereken başlıktır.
Goran

4
Merak edenler için, [JSON] sadece JSON dizesi için bir yer tutucudur. JSON dizenizin etrafına fazladan köşeli parantez eklemeyin.
Mihai Todor

92

Orijinal gönderide başka sorunlar (yani eksik "-d") olmasına rağmen, hata mesajı daha geneldir.

curl: (3) [globbing] yuvalanmış kaşlı ayraçlar konum X'te desteklenmiyor

Bunun nedeni, küme parantezlerinin {} ve köşeli parantezlerin [] rotasyonelde özel genelleme karakterleri olmasıdır. Bu genellemeyi kapatmak için " -g " seçeneğini kullanın.

Örnek olarak, aşağıdaki Solr faset sorgusu curl globbing'i kapatmak için "-g" olmadan başarısız olacaktır : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'


4
Bu benim için doğru çözümdü, -gbeklendiği gibi çalıştı. Teşekkürler @Yonik
arjones

3
Tanrım, GraphQL curl problemime bir çözüm arıyordum ve bu bana yardımcı oldu. Muhteşem sos.
NetOperator Wibby

39

AcceptBaşlığın sunucuya geri kabul ettiğimiz şey hakkında bir şeyler söylediği belirtilmelidir , oysa bu bağlamdaki ilgili başlıkContent-Type

JSON gönderirken Content-Typeolduğu gibi belirtmeniz genellikle tavsiye edilir application/json. Curl için sözdizimi şöyledir:

-H 'Content-Type: application/json'

Yani tam curl komutu şöyle olacaktır:

curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

2

-G ile birlikte çift tırnak yerine tek bir alıntı kullanmayı deneyin

Aşağıdaki senaryo benim için çalıştı

curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

İLE

curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

Bu özellikle hata curl komut hatamı çözdü : hatalı url iki nokta üst üste ilk karakterdir


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.