REST - HTTP Post Multipart dengan JSON

89

Saya perlu menerima HTTP Post Multipart yang hanya berisi 2 parameter:

  • String JSON
  • File biner

Manakah cara yang benar untuk mengatur tubuh? Saya akan menguji panggilan HTTP menggunakan konsol REST Chrome, jadi saya ingin tahu apakah solusi yang tepat adalah dengan menyetel kunci "label" untuk parameter JSON dan file biner.

Di sisi server saya menggunakan Resteasy 2.x, dan saya akan membaca badan Multipart seperti ini:

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

Apakah ini cara untuk pergi? Apakah benar untuk mengambil string JSON saya menggunakan kunci "myJsonName" yang mengidentifikasi disposisi konten tertentu? Apakah ada cara lain untuk menerima 2 konten ini dalam satu permintaan multi bagian HTTP?

Terima kasih sebelumnya

thermz
sumber
1
Sumber daya REST macam apa ini? Bagaimana dua bagian berhubungan dengan tingkat sumber daya?
Sebenarnya cara kita menangani sumber daya ini tidak sepenuhnya RESTful karena gambar adalah "komponen" sumber daya, bukan sumber daya lain.
thermz

Jawaban:

149

Jika saya memahami Anda dengan benar, Anda ingin membuat permintaan multi bagian secara manual dari konsol HTTP / REST. Format multibagian sederhana; pengantar singkat dapat ditemukan di spesifikasi HTML 4.01 . Anda perlu membuat batas, yang merupakan string yang tidak ditemukan dalam konten, katakanlah HereGoes. Anda mengatur header permintaan Content-Type: multipart/form-data; boundary=HereGoes. Maka ini harus menjadi badan permintaan yang valid:

--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--
Vasiliy Faronov
sumber
Anda sebenarnya bisa menambahkan lampiran di soap-ui juga. Hal ini mengurangi keharusan untuk memasukkan isi posting yang sebenarnya dan jenis konten.
shane lee
1
Apakah ada cara standar untuk menghasilkan batas unik?
andig
2
@andig Saya tidak menyadarinya. Mungkin Anda bisa menggunakan UUID , tetapi itu belum tentu merupakan ide yang bagus. Biasanya perpustakaan HTTP Anda harus mengurusnya untuk Anda.
Vasiliy Faronov
Jika kita tahu kita hanya memiliki data json dan base64 dalam permintaan, bukankah seharusnya sesuatu seperti \*berfungsi sebagai batasan? Itu tidak diizinkan untuk ada di json atau base64.
DaedalusAlpha
2
Mengapa menggunakan base64 untuk menyandikan data JPEG? HTTP memungkinkan Anda mengirim byte mentah.
Alexandre Blin