Câu hỏi Làm thế nào để POST dữ liệu JSON với Curl từ Terminal / Commandline để kiểm tra Spring REST?


Tôi sử dụng Ubuntu và cài đặt Curl trên đó. Tôi muốn thử nghiệm ứng dụng Spring REST của mình với Curl. Tôi đã viết mã POST của tôi ở phía Java. Tuy nhiên, tôi muốn thử nghiệm nó với Curl. Tôi đang cố đăng dữ liệu JSON. Một ví dụ dữ liệu là như thế này:

{"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}

Tôi sử dụng lệnh này:

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

Nó trả về lỗi này:

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

Mô tả lỗi là:

Máy chủ từ chối yêu cầu này vì thực thể yêu cầu ở định dạng không được tài nguyên được yêu cầu hỗ trợ cho phương thức được yêu cầu ().

Nhật ký Tomcat:     "POST / ui / webapp / conf / xóa HTTP / 1.1" 415 1051

Bất kỳ ý tưởng về định dạng đúng của lệnh Curl?

CHỈNH SỬA:

Đây là mã PUT bên Java của tôi (tôi đã thử GET và DELETE và chúng hoạt động)

@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;
} 

2049
2017-08-24 08:51


gốc


kiểm tra liên kết cho mùa xuân 3.2.0 bài yêu cầu. - AmirHd
Có một bài đăng hay Sử dụng Curl cho Ad Hoc thử nghiệm của các dịch vụ nhỏ gọn RESTful bao gồm điều này với nhiều ví dụ. - upitau


Các câu trả lời:


Bạn cần đặt loại nội dung của bạn thành ứng dụng / json. Nhưng -d gửi loại nội dung application/x-www-form-urlencoded, không được chấp nhận ở phía Spring.

Hãy nhìn vào curl man page, Tôi nghĩ bạn có thể sử dụng -H:

-H "Content-Type: application/json"

Ví dụ đầy đủ:

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

(-H là viết tắt của --header, -d cho --data)

Lưu ý rằng -request POST Là không bắt buộc nếu bạn dùng -d, như -d cờ ngụ ý một yêu cầu POST.


Trên Windows, mọi thứ hơi khác một chút. Xem chuỗi nhận xét.


3234
2017-08-24 09:12



Tôi đã xóa tùy chọn -d khỏi lệnh nhưng vẫn giống nhau. - kamaci
cú pháp đầy đủ, đối với bất kỳ ai vẫn có thể bị nhầm lẫn, là: curl -X POST -H "Content-Type: application/json" -d '{"key":"val"}' URL - Adam Tuttle
curl -X POST -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login  đã làm cho tôi. - shweta
Đối với các cửa sổ, dấu nháy đơn quanh json không hoạt động và tôi đã thoát khỏi dấu nháy kép. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method - hIpPy
Đối với tôi trong Windows, tôi cần phải thoát khỏi các trích dẫn bằng cách sử dụng các trích dẫn ở định dạng này "{ """key1""": """value1""" }". Ngoài ra câu trả lời này: stackoverflow.com/questions/18314796/… - chodorowicz


Cố gắng đưa dữ liệu của bạn vào một tệp, nói body.json và sau đó sử dụng

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

426
2017-08-24 10:04



Nó trả về lỗi 404 - kamaci
Bạn có lẽ nên sử dụng --data-binary tùy chọn thay vì --data. Người ta sẽ mong đợi rằng khách hàng gửi dữ liệu như là, nhưng --data dải CR und LF từ đầu vào. - h2stein
Sử dụng cUrl với các chuỗi json nội tuyến có vẻ là một cơn ác mộng. Có cần phải scape nhân vật trích dẫn kép. Đi với một tập tin như thế này là đẹp hơn. - Xtreme Biker
Điều quan trọng là thêm một @ ký tự trước tên của tệp, nếu không nó sẽ không hoạt động. Tôi chỉ mất 20 phút đập đầu vào cái đống ... - Radu Murzea
Bằng cách này bạn cũng có thể chạy một lint JSON trên tệp để xem có lỗi trong phân tích cú pháp JSON hay không. - datashaman


Bạn có thể thấy hồi phục hữu ích: https://github.com/micha/resty

Đó là một CURL tròn bao bọc, giúp đơn giản hóa các yêu cầu REST dòng lệnh. Bạn trỏ nó đến điểm cuối API của bạn, và nó cung cấp cho bạn các lệnh PUT và POST. (Các ví dụ được điều chỉnh từ trang chủ)

$ 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

Ngoài ra, vẫn cần phải thêm tiêu đề Loại nội dung. Tuy nhiên, bạn có thể làm điều này một lần, để thiết lập mặc định, thêm các tệp cấu hình cho mỗi phương thức mỗi trang: Đặt tùy chọn RESTY mặc định


86
2018-01-12 19:10





Nó làm việc cho tôi bằng cách sử dụng:

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

Đó là hạnh phúc ánh xạ tới bộ điều khiển lò xo:

@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 là một đơn giản POJO với thuộc tính id.


69
2018-04-19 16:00





Đối với Windows, có một trích dẫn cho -d giá trị đã không làm việc cho tôi, nhưng nó đã làm việc sau khi thay đổi để báo giá gấp đôi. Ngoài ra tôi cần phải thoát khỏi dấu ngoặc kép bên trong dấu ngoặc nhọn.

Đó là, những điều sau đây không hoạt động:

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

Nhưng sau đây đã làm việc:

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

58
2018-06-30 22:12



FYI - có vẻ như bạn đang bỏ lỡ một dấu ngoặc kép đóng xung quanh cơ thể json - acanby
Đối với tôi trên Windows, "xung quanh dữ liệu không hoạt động, không có báo giá nào hoạt động - rodedo
Nếu bạn đang sử dụng PowerShell, hãy xem điều này câu trả lời. - rsenna


Ví dụ, tạo một tệp JSON, params.json và thêm nội dung này vào nó:

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

Sau đó, bạn chạy lệnh này:

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





Điều này làm việc tốt cho tôi.

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

Ở đâu,

-X Có nghĩa là động từ http.

--data Có nghĩa là dữ liệu bạn muốn gửi.


32
2017-07-01 14:31



Các -X POST là dư thừa trong ví dụ này - Engineer Dollery


Tôi chỉ chạy vào cùng một vấn đề. Tôi có thể giải quyết nó bằng cách chỉ định

-H "Content-Type: application/json; charset=UTF-8"

26
2017-11-15 15:45





Sử dụng CURL Windows, hãy thử cách này:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee

23
2017-12-20 23:45





Nếu bạn đang thử nghiệm rất nhiều JSON gửi / phản hồi với giao diện RESTful, bạn có thể muốn kiểm tra Người phát thơ plug-in cho Chrome (cho phép bạn xác định thủ công các thử nghiệm dịch vụ web) và dựa trên Node.js của nó Người mới đồng hành dòng lệnh (cho phép bạn tự động hóa các bài kiểm tra đối với "các bộ sưu tập" của các bài kiểm tra Postman.) Cả hai đều miễn phí và mở!


15
2018-05-23 13:34