أدناه هو ما أحتاجه لتحميل
-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 لساعات ولكن لم أجد حلًا.
سأكون ممتنا للغاية إذا كان شخص ما يمكن أن يساعدني في هذا.
شكرا مقدما
ملاحظة: يبدو أن هذه المشكلة مرتبطة بـ https://github.com/lostisland/faraday/issues/830#issue -372589645 و https://github.com/lostisland/faraday/issues/769#issue -295426091 ، لكني لا يوجد حل .. الرجاء المساعدة ..
تكمن المشكلة في الطريقة التي يتم بها إنشاء الحمولة. وفقًا لمقتطف curl -data-binary
، يريد خادمك أن تحتوي قيمة النموذج message
application/json
على نوع المحتوى $ # $ 2 $ # $. ومع ذلك ، فإن الحمولة المُنشأة لا تحدد ذلك في أي مكان.
إليك كيفية إصلاحه في Faraday v1.0. تعرف على المزيد حول برمجية Multipart Middleware ...
-payload = {message: JSON.dump(message)}
+payload = { message: Faraday::ParamPart.new(JSON.dump(message), ‘application/json’) }
في Faraday v0.1x (تم تأكيده في 0.17.3). لاحظ أن هذا لا يزال يرسل "ملفًا" يتم قراءته فقط من كائن إدخال / إخراج في الذاكرة. نأمل أن لا يهتم الخادم بقيم الترويسة الإضافية متعددة الأجزاء. يمكنك رؤية التفاصيل في الطلب الثالث أسفل هذه الرسالة.
-payload = {message: JSON.dump(message)}
+{ message: Faraday::UploadIO.new(StringIO.new(JSON.dump(message)), 'application/json') }
لا أعرف ماذا أفعل بخصوص رسالة الخطأ التي رد بها الخادم.
نوع المحتوى "application / octet-Stream" غير مدعوم
آمل أن يؤدي إصلاح مشكلة نوع المحتوى متعدد الأجزاء إلى حلها ، حيث لا أرى من أين يأتي application/octet-stream
.
اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى!
يمكنك مشاهدة مقتطفات رمز العمل في multart.rb · جيثب . نظرًا لأن 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——————
طلب مع نوع المحتوى (Faraday 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
بعد الآن.
أتمنى أن تحظى بيوم رائع: د
سعيد لسماع أنه يعمل كما هو متوقع الآن!
أحسنت echnoweenie ، شكرًا لمعالجة هذه المشكلة الصعبة بسرعة 👏!
التعليق الأكثر فائدة
تكمن المشكلة في الطريقة التي يتم بها إنشاء الحمولة. وفقًا لمقتطف
curl -data-binary
، يريد خادمك أن تحتوي قيمة النموذجmessage
application/json
على نوع المحتوى $ # $ 2 $ # $. ومع ذلك ، فإن الحمولة المُنشأة لا تحدد ذلك في أي مكان.إليك كيفية إصلاحه في Faraday v1.0. تعرف على المزيد حول برمجية Multipart Middleware ...
في Faraday v0.1x (تم تأكيده في 0.17.3). لاحظ أن هذا لا يزال يرسل "ملفًا" يتم قراءته فقط من كائن إدخال / إخراج في الذاكرة. نأمل أن لا يهتم الخادم بقيم الترويسة الإضافية متعددة الأجزاء. يمكنك رؤية التفاصيل في الطلب الثالث أسفل هذه الرسالة.
لا أعرف ماذا أفعل بخصوص رسالة الخطأ التي رد بها الخادم.
آمل أن يؤدي إصلاح مشكلة نوع المحتوى متعدد الأجزاء إلى حلها ، حيث لا أرى من أين يأتي
application/octet-stream
.اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى!
عرض عملي
يمكنك مشاهدة مقتطفات رمز العمل في multart.rb · جيثب . نظرًا لأن RequestBin الذي يشير إليه الرمز يحتفظ فقط بمعلومات الطلب مؤقتًا ، فأنا أسجل التفاصيل أدناه:
طلب بدون نوع محتوى في الحمولة:
طلب مع نوع المحتوى (فاراداي 1.0)
طلب مع نوع المحتوى (Faraday v0.17.3)