Pertanyaan Bagaimana cara mengirim data POST JSON dengan Curl dari Terminal / Commandline ke Test Spring REST?


Saya menggunakan Ubuntu dan menginstal Curl di atasnya. Saya ingin menguji aplikasi Spring REST dengan Curl. Saya menulis kode POST saya di sisi Java. Namun, saya ingin mengujinya dengan Curl. Saya mencoba mengirim data JSON. Contoh data adalah seperti ini:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

Saya menggunakan perintah ini:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

Ini mengembalikan kesalahan ini:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

Deskripsi kesalahannya adalah ini:

Server menolak permintaan ini karena entitas permintaan dalam format tidak didukung oleh sumber yang diminta untuk metode yang diminta ().

Log Tomcat:     "POST / ui / webapp / conf / hapus HTTP / 1.1" 415 1051

Ada gagasan tentang format yang tepat dari perintah Curl?

EDIT:

Ini adalah kode PUT sisi Java saya (saya telah menguji GET dan DELETE dan mereka bekerja)

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
} 

2042
2017-08-24 08:51


asal


Jawaban:


Anda perlu mengatur tipe konten Anda ke aplikasi / json. Tapi -d mengirim Content-Type application/x-www-form-urlencoded, yang tidak diterima di sisi Spring.

Melihat ke curl man page, Saya pikir Anda bisa menggunakannya -H:

-H "Content-Type: application/json"

Contoh lengkap:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

(-H adalah kependekan dari --header, -d untuk --data)

Perhatikan itu -request POST aku s pilihan jika kamu gunakan -d, seperti -d bendera menyiratkan permintaan POST.


Di Windows, semuanya sedikit berbeda. Lihat utas komentar.


3229
2017-08-24 09:12



Cobalah untuk memasukkan data Anda ke dalam file, misalnya body.json lalu gunakan

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

424
2017-08-24 10:04



Anda mungkin merasa nyaman untuk beristirahat: https://github.com/micha/resty

Ini adalah CURL bundar pembungkus yang menyederhanakan permintaan REST baris perintah. Anda mengarahkannya ke titik akhir API Anda, dan memberi Anda perintah PUT dan POST. (Contoh yang diadaptasi dari beranda)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

Selain itu, sering kali perlu menambahkan header Content Type. Anda dapat melakukan ini sekali, meskipun, untuk mengatur default, dari menambahkan file konfigurasi per-metode per-situs: Menetapkan opsi RESTY default


86
2018-01-12 19:10



Ini berhasil bagi saya menggunakan:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

Itu dengan senang hati dipetakan ke pengontrol Spring:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnly itu sederhana POJO dengan sebuah properti id.


69
2018-04-19 16:00



Untuk Windows, memiliki satu kutipan untuk -d nilai tidak bekerja untuk saya, tetapi berhasil setelah mengubah untuk menggandakan kutipan. Juga saya perlu menghindari tanda kutip ganda di dalam kurung kurawal.

Artinya, hal berikut tidak berfungsi:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

Tetapi yang berikut berhasil:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

58
2018-06-30 22:12



Sebagai contoh, buat file JSON, params.json, dan tambahkan konten ini ke dalamnya:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

Kemudian Anda menjalankan perintah ini:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server

37
2018-01-05 23:10



Ini bekerja dengan baik untuk saya.

curl -X POST --data @json_out.txt http://localhost:8080/

Dimana,

-X Berarti kata kerja http.

--data Berarti data yang ingin Anda kirim.


31
2017-07-01 14:31