Làm thế nào để vượt qua tải trọng thông qua tệp JSON cho curl?


201

Tôi có thể tạo thành công một địa điểm thông qua curlthực hiện lệnh sau:

$ curl -vX POST https://server/api/v1/places.json -d "
  auth_token=B8dsbz4HExMskqUa6Qhn& \
  place[name]=Fuelstation Central& \
  place[city]=Grossbeeren& \
  place[address]=Buschweg 1& \
  place[latitude]=52.3601& \
  place[longitude]=13.3332& \
  place[washing]=true& \
  place[founded_at_year]=2000& \
  place[products][]=diesel& \
  place[products][]=benzin \
"

Máy chủ trả về HTTP/1.1 201 Created.
Bây giờ tôi muốn lưu trữ tải trọng trong một tệp JSON trông như thế này:

// testplace.json
{
  "auth_token" : "B8dsbz4HExMskqUa6Qhn",
  "name" : "Fuelstation Central",
  "city" : "Grossbeeren",
  "address" : "Buschweg 1",
  "latitude" : 52.3601,
  "longitude" : 13.3332,
  "washing" : true,
  "founded_at_year" : 2000,
  "products" : ["diesel","benzin"]
}

Vì vậy, tôi sửa đổi lệnh sẽ được thực thi như thế này:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

Điều này không trở lại HTTP/1.1 401 Unauthorized. Tại sao?


1
Ngoài ra, hãy nhớ rằng nếu bạn đang tải lên tệp nhị phân, bạn nên sử dụng --data-binary.
AhmetB - Google

Câu trả lời:


329

curlgửi yêu cầu POST với loại nội dung mặc định là application/x-www-form-urlencoded. Nếu bạn muốn gửi một yêu cầu JSON, bạn sẽ phải chỉ định tiêu đề loại nội dung chính xác:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

Nhưng điều đó sẽ chỉ hoạt động nếu máy chủ chấp nhận đầu vào json. Ở .jsoncuối url chỉ có thể chỉ ra rằng đầu ra là json, điều đó không nhất thiết có nghĩa là nó cũng sẽ xử lý đầu vào json . Tài liệu API sẽ cung cấp cho bạn một gợi ý về việc nó có hay không.

Lý do bạn nhận được 401và không phải một số lỗi khác có thể là do máy chủ không thể trích xuất auth_tokentừ yêu cầu của bạn.


8
Tôi đã cố gắng sử dụng cat file.jsonsau -dvà đã gặp rắc rối với nó, cho đến khi tôi biết được câu trả lời này mà tôi có thể sử dụng @file.json. Cảm ơn :)
shadi

1
lưu ý rằng nếu bạn cần nhiều tiêu đề, bạn cần chỉ định -H/ --headernhiều lần, ít nhất là khi được thử nghiệm trong bash trên Ubuntu.
Chaim Eliyah
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.