Yêu cầu Curl GET với tham số json


124

Tôi đang cố gắng gửi yêu cầu "GET" tới API REST từ xa từ Command Prompt qua cURL như sau:

curl -X GET -H "Content-type: application/json" -H "Accept: application/json"  "http://server:5050/a/c/getName/{"param0":"pradeep"}"

Nhưng nó không trả về đầu ra. Tôi đã cố gắng ping URL trực tiếp từ trình duyệt, tôi có thể nhận được phản hồi thành công, tôi không hiểu có vấn đề gì với lệnh.

Về cơ bản, tôi muốn đặt một yêu cầu "GET" cho một dịch vụ REST từ xa, cung cấp cho tôi dữ liệu json dưới dạng phản hồi thông qua curl. Bất cứ ai có thể hướng dẫn cho tôi những gì tôi đang làm sai? Tôi đã thử các bài đăng khác nhau, nhưng tất cả chúng đều nói về yêu cầu ĐĂNG không phải về GET.


những lỗi nào đang được đăng trên phía máy chủ của bạn?
Scary Wombat

Không có lỗi, phía máy chủ nó đang thực thi thành công. Nhưng từ phía curl, nó không hiển thị bất kỳ dữ liệu nào. Nó chỉ ping sau vài giây nó chỉ hiển thị trống không có dữ liệu.
Pradeep Simha

bạn có thể thử với máy chủ curl -i -H "Accept: application / json" " : 5050 / a / c / getName {" param0 ":" pradeep "}" (tùy chọn -i thay vì x).
Harshal Bulsara

Câu trả lời:


139

Điều này sẽ hoạt động:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

sử dụng tùy chọn -i thay vì x.


4
có lẽ báo giá khác nhau? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB

Nó thực sự phải là một trong hai 'server:5050/a/c/getName{"param0":"pradeep"}'hoặc "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.

16

Nếu bạn muốn gửi dữ liệu của mình bên trong phần thân, thì bạn phải tạo POSThoặc PUTthay thế GET.

Đối với tôi, có vẻ như bạn đang cố gắng gửi truy vấn có tham số uri , không liên quan đến GET, bạn cũng có thể đặt các tham số này POST, PUTv.v.

Truy vấn là một phần tùy chọn, được phân tách bằng dấu chấm hỏi ("?"), Chứa thông tin nhận dạng bổ sung không có tính chất phân cấp. Cú pháp chuỗi truy vấn không được xác định chung chung, nhưng nó thường được tổ chức dưới dạng chuỗi các cặp =, với các cặp được phân tách bằng dấu chấm phẩy hoặc dấu và.

Ví dụ:

curl http://server:5050/a/c/getName?param0=foo&param1=bar

7
Bất kỳ thông báo yêu cầu HTTP nào đều được phép chứa nội dung thông báo. Nó không bao giờ hữu ích cho GET vì ngữ nghĩa của GET - nội dung của phần thân yêu cầu, nếu có, sẽ không thay đổi phản hồi.
Jarek Przygódzki

12

Nếu bạn thực sự muốn gửi yêu cầu GET với JSON trong nội dung (giả sử đối với yêu cầu XHR và bạn biết máy chủ hỗ trợ xử lý nội dung đối với yêu cầu GET), bạn có thể:

curl -X GET \
  -H "Content-type: application/json" \
  -H "Accept: application/json" \
  -d '{"param0":"pradeep"}' \
  "http://server:5050/a/c/getName"

Hầu hết các máy chủ web hiện đại đều chấp nhận loại yêu cầu này.


Điều này không hoạt động tạo ra kết quả dự kiến. Sử dụng httpbin.org/get để gỡ lỗi, kết quả là: { "args": {}, "headers": { "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" }, "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get" }Không nhận được gì. Bạn cần phải sử dụng một chuỗi truy vấn nhưcurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques

Điều đó phụ thuộc vào việc máy chủ web của bạn có đang kiểm tra nội dung các yêu cầu GET hay không, điều này tôi thừa nhận không hoàn toàn là hành vi tiêu chuẩn. Bạn có thể tốt hơn bằng cách sử dụng các tham số truy vấn url như bạn nói. Một vấn đề với việc sử dụng body on get request là trình duyệt không thể phát lại yêu cầu bằng cách điều hướng bằng lịch sử trình duyệt, mặc dù điều này có thể ổn đối với các yêu cầu XHR.
Steven Soroka

Ngoài ra, những gì người ta có thể làm, nếu người ta có đủ quyền kiểm soát ở phía máy chủ, là thêm một thuộc tính đặc biệt trong dữ liệu json như "phương thức": "get", gửi tải trọng trong một yêu cầu đăng và để mã trên máy chủ giải thích điều này như một yêu cầu nhận.
Jacques

@Jacques chắc chắn, nhưng nếu bạn có quyền kiểm soát máy chủ, bạn có thể dễ dàng để máy chủ của bạn đọc phần thân của các yêu cầu GET. Quay trở lại câu hỏi ban đầu, tôi nghĩ toàn bộ nội dung này hơi lạc đề. Đọc lại câu hỏi, tôi không nghĩ rằng OP có quyền truy cập để thay đổi máy chủ.
Steven Soroka

Vâng đó là sự thật. Nếu bạn kiểm soát máy chủ. Nhận xét của tôi bị thúc đẩy bởi tuyên bố sau đây mà bạn đưa ra, như tôi đã nói, sẽ không tạo ra kết quả như mong muốn: "Hầu hết các máy chủ web hiện đại đều chấp nhận loại yêu cầu này". Trên thực tế, họ sẽ chấp nhận yêu cầu mà bạn mô tả, nhưng yêu cầu sẽ không mang lại kết quả như mong muốn. Hoặc bạn có thể muốn xem xét lại tuyên bố như thế này: "Hầu hết các máy chủ web hiện đại chấp nhận kiểu này yêu cầu giả sử bạn có quyền kiểm soát trực tiếp ở phía máy chủ, nhưng điều này là phi tiêu chuẩn"
Jacques

8

GET nhận các cặp giá trị tên.

Hãy thử một cái gì đó như:

curl http://server:5050/a/c/getName/?param1=pradeep

hoặc là

curl http://server:5050/a/c/getName?param1=pradeep

btw một REST thông thường sẽ trông giống như

curl http://server:5050/a/c/getName/pradeep Nếu nó sử dụng JSON trong GET URL, thì đó không phải là cách chuẩn.


4

Đối với các dịch vụ được bảo vệ bằng tên người dùng và mật khẩu, hãy sử dụng như sau

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'

curl -X POST -H "Content-type: application / json" -d '{"things": "things"}' http: // ...
keithpjolley

Hãy sửa cho tôi nếu tôi sai, nhưng có -d trên một yêu cầu curl (và không chỉ định phương thức) sẽ khiến yêu cầu trở thành POST.
Gokigooooks

3

Thử

curl -G ...

thay vì

curl -X GET ...

Thông thường bạn không cần tùy chọn này. Tất cả các loại yêu cầu GET, HEAD, POST và PUT khá được gọi bằng cách sử dụng các tùy chọn dòng lệnh chuyên dụng.

Tùy chọn này chỉ thay đổi từ thực tế được sử dụng trong yêu cầu HTTP, nó không thay đổi cách curl hoạt động. Vì vậy, ví dụ: nếu bạn muốn thực hiện một yêu cầu HEAD thích hợp, sử dụng -X HEAD sẽ không đủ. Bạn cần sử dụng tùy chọn -I, --head.


1

Không có giải pháp nào được đề cập ở trên phù hợp với tôi do một số lý do. Đây là giải pháp của tôi. Nó khá cơ bản.

curl -X GET API_ENDPOINT -H 'Content-Type: application / json' -d ' JSON_DATA '

API_ENDPOINT là điểm cuối api của bạn, ví dụ: http://127.0.0.1:80/api

-H đã được sử dụng để thêm nội dung tiêu đề.

JSON_DATA là nội dung yêu cầu của bạn, nó có thể giống như :: {"data_key": "value"}. '' JSON_DATA xung quanh là quan trọng.

Bất kỳ thứ gì sau -d là dữ liệu bạn cần gửi trong yêu cầu GET

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.