Làm cách nào để tôi gửi dữ liệu JSON bằng cURL?


2833

Tôi sử dụng Ubuntu và cài đặt cURL trên 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 mình ở phía Java. Tuy nhiên, tôi muốn thử nghiệm nó với cURL. Tôi đang cố gắng đăng một dữ liệu JSON. Dữ liệu ví dụ 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à đây:

Máy chủ từ chối yêu cầu này vì thực thể yêu cầu có định dạng không được tài nguyên 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

Định dạng đúng của lệnh cURL là gì?

Đây là PUTmã bên Java của tôi (Tôi đã kiểm tra 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;
}

6
kiểm tra các liên kết cho các yêu cầu bài viết mùa xuân 3.2.0.
AmirHd

8
Có một bài viết hay bằng cách sử dụng Curl để kiểm tra Ad Hoc của RESTful microservice bao gồm điều này với nhiều ví dụ.
upitau

Câu trả lời:


4341

Bạn cần đặt loại nội dung của mình thành application / json. Nhưng -dgửi Kiểu nội dung application/x-www-form-urlencoded, không được chấp nhận về phía Spring.

Nhìn vào trang người đàn ông cong , 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

( -Hviết tắt của --header, -dcho --data)

Lưu ý rằng đó -request POSTtùy chọn nếu bạn sử dụng -d, vì -dcờ ngụ ý yêu cầu POST.


Trên Windows, mọi thứ hơi khác một chút. Xem chủ đề bình luận.


262
Đối với cửa sổ, các trích dẫn đơn xung quanh json không hoạt động và cuối cùng tôi đã thoát được dấu ngoặc kép. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy

37
Đối với tôi trong Windows, tôi cần thoát dấu ngoặc kép bằng định dạng này "{ """key1""": """value1""" }". Ngoài ra câu trả lời này: stackoverflow.com/questions/18314796/
Kẻ

4
@chodorowicz thật kinh khủng! Tôi chỉ biết cú pháp từ VB!
Sean Patrick Floyd

3
Tôi đã gặp vấn đề với các yêu cầu POST nhưng đã giải quyết nó bằng cách viết hoa "Application / json" vì vậy nếu bạn gặp lỗi 415, hãy kiểm tra viết hoa.
WiteCastle

5
@ostrokach xin lỗi nó làm lãng phí thời gian của bạn. cú pháp hoạt động tốt với tôi trên OSX khi tôi đăng nó (chưa thử lại). Đoán nó là / chỉ là một sự khác biệt nền tảng. Tôi tưởng tượng các upvote là từ những người mà nó đã giúp đỡ.
Adam T Ink

565

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

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

12
Bạn có thể nên sử dụng --data-binarytùy chọn thay vì --data. Người ta mong đợi rằng máy khách sẽ gửi dữ liệu nguyên trạng, nhưng --dataloại bỏ CR und LF khỏi đầu vào.
h2stein

14
Sử dụng cUrl với chuỗi json nội tuyến dường như là một cơn ác mộng. Có nhu cầu để nhân đôi nhân vật trích dẫn. Đi với một tập tin như thế này là đẹp hơn.
Xtreme Biker

46
Đ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 vừa mới dành 20 phút đập đầu vào cái
thứ nhảm nhí

3
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 khi phân tích cú pháp JSON không.
datashaman 7/12/2016

4
Trên Windows, bạn cần trích dẫn kép xung quanh tên tệp "@ body.json"
Stomf

100

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

Đây là một vòng bao bọc CURL giúp đơn giản hóa các yêu cầu REST của 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. (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, thường vẫn cần thêm các tiêu đề Kiểu Nội dung. Tuy nhiên, bạn có thể thực hiện việc này một lần để đặt mặc định, thêm tệp cấu hình cho mỗi phương thức trên mỗi trang: Đặt tùy chọn RESTY mặc định


93

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

Đó là, 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

5
FYI - có vẻ như bạn đang thiếu một trích dẫn gấp đôi quanh cơ thể json
acanby

3
Đối với tôi trên Windows, "xung quanh dữ liệu không hoạt động, thay vào đó, không có trích dẫn nào hoạt động
Rodedo

3
Nếu bạn đang sử dụng PowerShell, hãy xem câu trả lời này .
rsenna

86

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

Nó được hạnh phúc ánh xạ tới bộ điều khiển 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";
}

IdOnlylà một POJO đơn giản với thuộc tính id.


56

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

42

Tôi chỉ gặp vấn đề tương tự. Tôi có thể giải quyết nó bằng cách chỉ định

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

37

Đ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.


5
Điều -X POSTnày là dư thừa trong ví dụ này
Kỹ sư phần mềm

31

Bạn có thể sử dụng Postman với GUI trực quan của nó để tập hợp cURLlệnh của bạn .

  1. Cài đặt và bắt đầu Postman
  2. Nhập URL, Nội dung bài đăng, Tiêu đề yêu cầu, v.v. Trang.
  3. Bấm vào Code
  4. Chọn cURLtừ danh sách thả xuống
  5. sao chép và dán cURLlệnh của bạn

Lưu ý: Có một số tùy chọn để tạo yêu cầu tự động trong danh sách thả xuống, đó là lý do tại sao tôi nghĩ rằng bài đăng của tôi không cần thiết ở nơi đầu tiên.


6
Không nhận ra tính năng đó đã được đưa vào Postman. Cảm ơn đã chỉ ra điều đó!
ariestav

29

Sử dụng Windows CURL, hãy thử điều này:

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

28

Bạn có thể sử dụng người đưa thư để chuyển đổi sang CURLnhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1
Cảm ơn rất nhiều @ mãi mãi-LA đó là một mẹo tiết kiệm cuộc sống cho tôi
vibs2006

24

HTTPie là một giải pháp thay thế được đề xuất curlbởi vì bạn có thể làm

$ http POST http://example.com/some/endpoint name=value name1=value1

Nó nói JSON theo mặc định và sẽ xử lý cả việc đặt tiêu đề cần thiết cho bạn cũng như mã hóa dữ liệu dưới dạng JSON hợp lệ. Ngoài ra còn có:

Some-Header:value

cho các tiêu đề, và

name==value

cho các tham số chuỗi truy vấn. Nếu bạn có một khối dữ liệu lớn, bạn cũng có thể đọc nó từ một tệp có mã hóa JSON:

 field=@file.txt

20

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


18

Điều này làm việc tốt với tôi, ngoài ra còn sử dụng xác thực BASIC:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"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://httpbin.org/post

Tất nhiên, bạn không bao giờ nên sử dụng xác thực BASIC mà không có SSL và chứng chỉ được kiểm tra.

Tôi đã gặp lại vấn đề này ngày hôm nay, bằng cách sử dụng cURL 7.49.1 của Cygwin cho Windows ... Và khi sử dụng --datahoặc --data-binaryvới một đối số JSON, cURL đã nhầm lẫn và sẽ diễn giải {}trong JSON dưới dạng mẫu URL. Thêm một -gđối số để tắt cURL globalbing đã cố định điều đó.

Xem thêm Truyền một URL có dấu ngoặc để cuộn tròn .


17

Bạn cũng có thể đặt nội dung JSON của mình vào một tệp và chuyển nó để cuộn tròn bằng cách sử dụng --file-uploadtùy chọn thông qua đầu vào tiêu chuẩn, như sau:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -

16

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

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json

10

Tôi đang sử dụng định dạng dưới đây để kiểm tra với máy chủ web.

use -F 'json data'

Giả sử định dạng chính tả JSON này:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

Ví dụ đầy đủ

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

6

Sử dụng tùy chọn -d để thêm tải trọng

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

Ngoài ra:

sử dụng -X POST để sử dụng phương thức POST

sử dụng -H 'Accept: application / json' để thêm tiêu đề loại chấp nhận

sử dụng -H 'Content-Type: application / json' để thêm tiêu đề loại nội dung


Tôi đã thử sử dụng nó nhưng gặp lỗi {"lỗi": ["không có dữ liệu được cung cấp"]}.
Suresh

6

Vui lòng kiểm tra công cụ này . Nó giúp bạn dễ dàng tạo các đoạn uốn cong.

curl -XGET -H "Accept: application/json" -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"

6

Điều này làm việc cho tôi trên Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

5

Đây là một cách khác để làm điều đó, nếu bạn có dữ liệu động được đưa vào.

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"

1
Bạn đã cứu mạng tôi!
Abhimanyu

4

Tôi biết, rất nhiều đã được trả lời cho câu hỏi này nhưng muốn chia sẻ nơi tôi có vấn đề:

curl -X POST http: // your-server-end-point -H "Content-Type: application / json" -d @ path-of-your-json-file.json

Xem, tôi đã làm mọi thứ đúng, Chỉ có một điều - "@" Tôi đã bỏ lỡ trước đường dẫn tệp JSON.

Tôi tìm thấy một tài liệu đi tới có liên quan trên internet - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

Hy vọng rằng có thể giúp đỡ một số ít. cảm ơn


1

Nếu bạn định cấu hình SWAGGER cho ứng dụng khởi động mùa xuân của mình và gọi bất kỳ API nào từ ứng dụng của bạn ở đó, bạn cũng có thể thấy Yêu cầu CURL đó.

Tôi nghĩ rằng đây là cách dễ dàng để tạo các yêu cầu thông qua CURL.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.