REST - JSON के साथ HTTP पोस्ट मल्टीपार्ट


88

मुझे एक HTTP पोस्ट मल्टीपार्ट प्राप्त करने की आवश्यकता है जिसमें केवल 2 पैरामीटर हैं:

  • एक JSON स्ट्रिंग
  • एक बाइनरी फ़ाइल

शरीर को सेट करने का सही तरीका कौन सा है? मैं Chrome REST कंसोल का उपयोग करके HTTP कॉल का परीक्षण करने जा रहा हूं, इसलिए मैं सोच रहा हूं कि क्या JSON पैरामीटर और बाइनरी फ़ाइल के लिए "लेबल" कुंजी सेट करना सही है।

सर्वर साइड पर मैं Resteasy 2.x का उपयोग कर रहा हूं, और मैं इस तरह मल्टीपार्ट बॉडी को पढ़ने जा रहा हूं:

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

क्या यह रास्ता है? क्या यह कुंजी "myJsonName" का उपयोग करके मेरे JSON स्ट्रिंग को पुनः प्राप्त करने के लिए सही है जो उस विशेष सामग्री-स्वभाव की पहचान करता है? क्या इन 2 सामग्री को एक HTTP मल्टीपार्ट अनुरोध में प्राप्त करने का कोई अन्य तरीका है?

अग्रिम में धन्यवाद


1
यह किस तरह का REST संसाधन है? संसाधन स्तर पर दो भाग कैसे संबंधित हैं?

वास्तव में जिस तरह से हमने इस संसाधन को संभाला है वह पूरी तरह से Restful नहीं है क्योंकि छवि किसी अन्य संसाधन के बजाय संसाधन का "घटक" है।
थर्मज

जवाबों:


148

अगर मैं आपको सही तरीके से समझता हूं, तो आप HTTP / REST कंसोल से मैन्युअल रूप से मल्टीपार्ट अनुरोध करना चाहते हैं। मल्टीपार्ट प्रारूप सरल है; एक संक्षिप्त परिचय HTML 4.01 कल्पना में पाया जा सकता है । आपको एक सीमा के साथ आने की जरूरत है, जो एक स्ट्रिंग है जो सामग्री में नहीं मिलती है, आइए बताते हैं HereGoes। आप अनुरोध शीर्ष लेख सेट करें Content-Type: multipart/form-data; boundary=HereGoes। तब यह एक मान्य अनुरोध निकाय होना चाहिए:

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

आप वास्तव में साबुन-उई में एक लगाव भी जोड़ सकते हैं। यह वास्तविक पोस्ट बॉडी और सामग्री-प्रकार में पास होने को कम करता है।
शाने ली

1
क्या अनोखी सीमा के साथ आने के लिए एक मानकीकृत तरीका है?
औरिग

2
@andig मुझे किसी के बारे में पता नहीं है। शायद आप एक यूयूआईडी का उपयोग कर सकते हैं , लेकिन यह जरूरी नहीं कि एक अच्छा विचार है। आम तौर पर आपके HTTP पुस्तकालय को आपके लिए ध्यान रखना चाहिए।
वासिलि फरोनोव

अगर हमें पता है कि हमारे पास केवल अनुरोध में json और base64 डेटा है, तो क्या \*उदाहरण के लिए कुछ ऐसा नहीं होना चाहिए जो सीमा के रूप में काम करता है? यह न तो json और base64 में मौजूद है।
DaedalusAlpha

2
JPEG डेटा को एनकोड करने के लिए base64 का उपयोग क्यों करें? HTTP आपको कच्ची बाइट भेजने की अनुमति देता है।
एलेक्जेंडर ब्लिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.