REST - Đa phần bài đăng HTTP với JSON


88

Tôi cần nhận Phần đa bài đăng HTTP chỉ chứa 2 tham số:

  • Một chuỗi JSON
  • Một tệp nhị phân

Cách đặt cơ thể nào là đúng? Tôi sẽ kiểm tra lệnh gọi HTTP bằng bảng điều khiển REST của Chrome, vì vậy tôi đang tự hỏi liệu giải pháp chính xác có phải là đặt khóa "nhãn" cho thông số JSON và tệp nhị phân hay không.

Ở phía máy chủ, tôi đang sử dụng Resteasy 2.x và tôi sẽ đọc phần nội dung Multipart như sau:

@POST
@Consumes("multipart/form-data")
public String postWithPhoto(MultipartFormDataInput  multiPart) {
  Map <String, List<InputPart>> params = multiPart.getFormDataMap();
  String myJson = params.get("myJsonName").get(0).getBodyAsString();
  InputPart imagePart = params.get("photo").get(0);
  //do whatever I need to do with my json and my photo
}

Đây có phải là con đường để đi? Việc truy xuất chuỗi JSON của tôi bằng cách sử dụng khóa "myJsonName" xác định bố trí nội dung cụ thể đó có đúng không? Có cách nào khác để nhận 2 nội dung này trong một yêu cầu nhiều phần HTTP không?

Cảm ơn trước


1
Đây là loại tài nguyên REST nào? Làm thế nào để hai phần liên quan đến cấp độ tài nguyên?

Trên thực tế, cách chúng tôi xử lý tài nguyên này không hoàn toàn RESTful vì hình ảnh là một "thành phần" của tài nguyên thay vì một tài nguyên khác.
thermz

Câu trả lời:


148

Nếu tôi hiểu bạn chính xác, bạn muốn soạn yêu cầu nhiều phần theo cách thủ công từ bảng điều khiển HTTP / REST. Định dạng nhiều phần rất đơn giản; có thể tìm thấy phần giới thiệu ngắn gọn trong thông số kỹ thuật HTML 4.01 . Bạn cần đưa ra một ranh giới, đó là một chuỗi không được tìm thấy trong nội dung, giả sử HereGoes. Bạn đặt tiêu đề yêu cầu Content-Type: multipart/form-data; boundary=HereGoes. Sau đó, đây phải là một cơ quan yêu cầu hợp lệ:

--HereGoes
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json

{"foo": "bar"}
--HereGoes
Content-Disposition: form-data; name="photo"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<...JPEG content in base64...>
--HereGoes--

Bạn cũng có thể thêm tệp đính kèm trong soap-ui. Điều này làm giảm bớt việc phải vượt qua nội dung bài đăng thực tế và loại nội dung.
shane lee

1
Có cách nào được chuẩn hóa để đưa ra ranh giới duy nhất không?
andig

2
@andig Tôi không biết về cái nào. Có lẽ bạn có thể sử dụng UUID , nhưng đó không nhất thiết là một ý tưởng hay. Thông thường, thư viện HTTP của bạn sẽ đảm nhận việc đó cho bạn.
Vasiliy Faronov

Nếu chúng ta biết rằng chúng ta chỉ có dữ liệu json và base64 trong yêu cầu, chẳng hạn như một cái gì đó chẳng \*hạn hoạt động như một ranh giới? Nó không được phép tồn tại trong json và base64.
DaedalusAlpha

2
Tại sao sử dụng base64 để mã hóa dữ liệu JPEG? HTTP cho phép bạn gửi các byte thô.
Alexandre Blin,
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.