Faraday: json और फ़ाइल को मल्टीपार्ट/फॉर्म-डेटा के रूप में अपलोड करने में सहायता चाहिए

को निर्मित 5 जन॰ 2020  ·  3टिप्पणियाँ  ·  स्रोत: lostisland/faraday

नीचे वह है जो मुझे अपलोड करने की आवश्यकता है

-data-binary $'

------WebKitFormBoundaryInmulX6ait6ZMLdu\r\n
Content-Disposition: form-data; name="message"; filename="blob"\r\n
Content-Type: application/json
{
 "title":"title of the message to be sent",
 "body":"body of the message to be sent",
 "attachedFileName":null,
 "attachedFileName2":null,
 "attachedFileName3":null,
 "recipientIdList":[186554]
}
 ------WebKitFormBoundaryInmulX6ait6ZMLdu--\r\n' --compressed

कृपया ध्यान दें कि सर्वर द्वारा प्राप्त सामग्री प्रकार multipart/form-data है

मेरा वर्तमान कोड नीचे जैसा दिखता है:

client = Faraday::Connection.new(url: BASE_URL) do |builder|
    builder.use :cookie_jar
    builder.use :multipart
    builder.use :url_encoded
    builder.adapter :net_http
end

message = {title: "title", body: "body of message", recipientIdList:[186554]}
payload = {message: JSON.dump(message)}

response = @client.post(URL) do |request|
    request.headers['Content-Type'] = 'multipart/form-data'
    request.body = payload
end

हालांकि, सर्वर से मुझे जो प्रतिक्रिया मिलती है वह है {"success"=>false, "errorCode"=>nil, "message"=>"Content type 'application/octet-stream' not supported", "data"=>nil}

मैंने कोड को थोड़ा-थोड़ा करके बदल दिया और फिर से कोशिश की, और घंटों तक Google पर खोज की लेकिन समाधान नहीं मिला।
अगर कोई इसमें मेरी मदद कर सकता है तो इसकी बहुत सराहना की जाएगी।
आपको पहले से धन्यवाद

PS यह समस्या https://github.com/lostisland/faraday/issues/830#issue -372589645 और https://github.com/lostisland/faraday/issues/769#issue -295426091 से संबंधित प्रतीत होती है, लेकिन मैं समाधान नहीं मिल रहा .. कृपया मदद करें ..

सबसे उपयोगी टिप्पणी

मुद्दा पेलोड के निर्माण के तरीके को लेकर है। आपके curl -data-binary स्निपेट के अनुसार, आपका सर्वर चाहता है कि message फ़ॉर्म मान में application/json सामग्री-प्रकार हो। हालाँकि, निर्मित पेलोड इसे कहीं भी निर्दिष्ट नहीं करता है।

यहां फैराडे v1.0 में इसे ठीक करने का तरीका बताया गया है। मल्टीपार्ट मिडलवेयर के बारे में और देखें…

-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }

फैराडे v0.1x में (0.17.3 में पुष्टि)। ध्यान दें कि यह अभी भी एक "फाइल" भेजता है जो सिर्फ इन-मेमोरी आईओ ऑब्जेक्ट से पढ़ रहा है। उम्मीद है कि सर्वर अतिरिक्त मल्टीपार्ट हेडर मानों पर ध्यान नहीं देता है। आप इस संदेश के नीचे तीसरे अनुरोध में विवरण देख सकते हैं।

-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }

मुझे नहीं पता कि आपके सर्वर ने जिस त्रुटि संदेश के साथ उत्तर दिया है, उसका क्या करना है।

सामग्री प्रकार 'एप्लिकेशन/ऑक्टेट-स्ट्रीम' समर्थित नहीं है

मुझे उम्मीद है कि मल्टीपार्ट सामग्री प्रकार की समस्या को ठीक करने से इसका समाधान हो जाएगा, क्योंकि मुझे नहीं पता कि application/octet-stream कहां से आ रहा है।

यदि आपको और प्रश्न पूछने हों तो मुझे बता दें!

मेरा काम दिखा रहा है

आप काम कर रहे कोड स्निपेट्स को multipart.rb · GitHub में देख सकते हैं। चूंकि RequestBin कि कोड संदर्भ केवल अस्थायी रूप से अनुरोध जानकारी रखता है, मैं नीचे विवरण रिकॉर्ड कर रहा हूं:

पेलोड में कोई सामग्री प्रकार के साथ अनुरोध:

# AMZ/Cloudfront headers removed
Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d
Connection: close
Connect-Time: 1
X-Request-Id: e802a260-56a9-4d01-a4ee-77f652380185
Content-Length: 253
Host: requestbin.io
User-Agent: Faraday v1.0.0
Accept: */*

——————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d
Content-Disposition: form-data; name=“message”

{“title”:”title”,”body":"body of message”,”recipientIdList":[186554]}
——————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d——————

सामग्री प्रकार के साथ अनुरोध (फैराडे 1.0)

Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4

Connection: close
Connect-Time: 0
Content-Length: 285
User-Agent: Faraday v1.0.0
X-Request-Id: 2bbb3705-42ec-4de2-877c-2afd588ed679
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: requestbin.io

——————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4
Content-Disposition: form-data; name=“message”
Content-Type: application/json

{“title”:”title”,”body":"body of message”,”recipientIdList”:[186554]}
——————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4——————

सामग्री प्रकार के साथ अनुरोध (फैराडे v0.17.3)

Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697
Connection: close
Content-Length: 363
User-Agent: Faraday v0.17.3
X-Request-Id: af65fc06-3914-4ab6-8dbf-b347a1ac498a
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: requestbin.io

——————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697
Content-Disposition: form-data; name=“message”; filename=“local.path"
Content-Length: 69
Content-Type: application/json
Content-Transfer-Encoding: binary

{“title”:”title”,”body”:”body of message”,”recipientIdList”:[186554]}
——————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697—

सभी 3 टिप्पणियाँ

मुद्दा पेलोड के निर्माण के तरीके को लेकर है। आपके curl -data-binary स्निपेट के अनुसार, आपका सर्वर चाहता है कि message फ़ॉर्म मान में application/json सामग्री-प्रकार हो। हालाँकि, निर्मित पेलोड इसे कहीं भी निर्दिष्ट नहीं करता है।

यहां फैराडे v1.0 में इसे ठीक करने का तरीका बताया गया है। मल्टीपार्ट मिडलवेयर के बारे में और देखें…

-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }

फैराडे v0.1x में (0.17.3 में पुष्टि)। ध्यान दें कि यह अभी भी एक "फाइल" भेजता है जो सिर्फ इन-मेमोरी आईओ ऑब्जेक्ट से पढ़ रहा है। उम्मीद है कि सर्वर अतिरिक्त मल्टीपार्ट हेडर मानों पर ध्यान नहीं देता है। आप इस संदेश के नीचे तीसरे अनुरोध में विवरण देख सकते हैं।

-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }

मुझे नहीं पता कि आपके सर्वर ने जिस त्रुटि संदेश के साथ उत्तर दिया है, उसका क्या करना है।

सामग्री प्रकार 'एप्लिकेशन/ऑक्टेट-स्ट्रीम' समर्थित नहीं है

मुझे उम्मीद है कि मल्टीपार्ट सामग्री प्रकार की समस्या को ठीक करने से इसका समाधान हो जाएगा, क्योंकि मुझे नहीं पता कि application/octet-stream कहां से आ रहा है।

यदि आपको और प्रश्न पूछने हों तो मुझे बता दें!

मेरा काम दिखा रहा है

आप काम कर रहे कोड स्निपेट्स को multipart.rb · GitHub में देख सकते हैं। चूंकि RequestBin कि कोड संदर्भ केवल अस्थायी रूप से अनुरोध जानकारी रखता है, मैं नीचे विवरण रिकॉर्ड कर रहा हूं:

पेलोड में कोई सामग्री प्रकार के साथ अनुरोध:

# AMZ/Cloudfront headers removed
Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d
Connection: close
Connect-Time: 1
X-Request-Id: e802a260-56a9-4d01-a4ee-77f652380185
Content-Length: 253
Host: requestbin.io
User-Agent: Faraday v1.0.0
Accept: */*

——————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d
Content-Disposition: form-data; name=“message”

{“title”:”title”,”body":"body of message”,”recipientIdList":[186554]}
——————RubyMultipartPost-10fbc5eb433c89c0eca87785f09ae45d——————

सामग्री प्रकार के साथ अनुरोध (फैराडे 1.0)

Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4

Connection: close
Connect-Time: 0
Content-Length: 285
User-Agent: Faraday v1.0.0
X-Request-Id: 2bbb3705-42ec-4de2-877c-2afd588ed679
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: requestbin.io

——————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4
Content-Disposition: form-data; name=“message”
Content-Type: application/json

{“title”:”title”,”body":"body of message”,”recipientIdList”:[186554]}
——————RubyMultipartPost-9d77ee5700e0658dddb09ac41fad5fa4——————

सामग्री प्रकार के साथ अनुरोध (फैराडे v0.17.3)

Content-Type: multipart/form-data; boundary=—————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697
Connection: close
Content-Length: 363
User-Agent: Faraday v0.17.3
X-Request-Id: af65fc06-3914-4ab6-8dbf-b347a1ac498a
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Host: requestbin.io

——————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697
Content-Disposition: form-data; name=“message”; filename=“local.path"
Content-Length: 69
Content-Type: application/json
Content-Transfer-Encoding: binary

{“title”:”title”,”body”:”body of message”,”recipientIdList”:[186554]}
——————RubyMultipartPost-697c8614200bc0d7ae2fcc0215a2a697—

आपकी मदद के लिए बहुत-बहुत धन्यवाद, @technoweenie ! तुम कमाल हो!!
अनुरोध अब नवनिर्मित पेलोड के साथ ठीक काम करता है, और यह अब application/octet-stream के बारे में शिकायत नहीं करता है।
आशा है कि आपका दिन अच्छा रहेगा :D

यह सुनकर खुशी हुई कि यह अब उम्मीद के मुताबिक काम कर रहा है!
अच्छा किया @technoweenie , इस मुश्किल मुद्दे से इतनी जल्दी निपटने के लिए धन्यवाद !

क्या यह पृष्ठ उपयोगी था?
0 / 5 - 0 रेटिंग्स