REST - HTTP Post Multipart พร้อม JSON


89

ฉันต้องการรับ HTTP Post Multipart ซึ่งมีเพียง 2 พารามิเตอร์:

  • สตริง JSON
  • ไฟล์ไบนารี

วิธีตั้งศพที่ถูกต้องคือข้อใด? ฉันกำลังจะทดสอบการเรียก HTTP โดยใช้คอนโซล Chrome REST ดังนั้นฉันจึงสงสัยว่าวิธีแก้ปัญหาที่ถูกต้องคือการตั้งค่าคีย์ "label" สำหรับพารามิเตอร์ JSON และไฟล์ไบนารีหรือไม่

ในฝั่งเซิร์ฟเวอร์ฉันใช้ Resteasy 2.x และฉันจะอ่านเนื้อหา Multipart ดังนี้:

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

Is this the way to go? Is it correct to retrieve my JSON string using the key "myJsonName" that identify that particular content-disposition? Are there any other way to receive these 2 content in one HTTP multipart request?

Thanks in advance


1
What kind of REST resource is this? How do two parts relate on the resource level?

Actually the way we handled this resource is not totally RESTful because the image is a "component" of the resource instead of another resource.
thermz

คำตอบ:


149

If I understand you correctly, you want to compose a multipart request manually from an HTTP/REST console. The multipart format is simple; a brief introduction can be found in the HTML 4.01 spec. You need to come up with a boundary, which is a string not found in the content, let’s say HereGoes. You set request header Content-Type: multipart/form-data; boundary=HereGoes. Then this should be a valid request body:

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

You can actually add an attachment in soap-ui too. This alleviates having to pass in the actual post body and the content-type.
shane lee

1
Is there a standardized way for coming up with the unique boundary?
andig

2
@andig I’m not aware of any. Perhaps you could use a UUID, but that’s not necessarily a good idea. Normally your HTTP library should take care of that for you.
Vasiliy Faronov

If we know we only have json and base64 data in the request shouldn't something like \* for example work as a boundary? It's neither allowed to exist in json nor base64.
DaedalusAlpha

2
Why use base64 to encode the JPEG data? HTTP allows you to send the raw bytes.
Alexandre Blin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.