रूबी सिनात्रा बहु भाग पोस्ट अनुरोध के साथ - रूबी, नोड.जेएस, http, sinatra

सुनिश्चित नहीं है कि यह बहु पार्ट पोस्ट अनुरोध के कारण एक समस्या है या नहीं। क्लाइंट साइड से, मैंने node.js. का उपयोग करके एक पोस्ट अनुरोध भेजा पोस्ट बॉडी एक JSON सरणी है

var post_req = http.request(options, function(res) {
res.setEncoding("utf8");
res.on("data", function (chunk) {
console.log("Response: " + chunk);
});
}).on("error",function(){});
post_req.write(data.toString().split("").join(""));
post_req.end();

सर्वर की तरफ (रूबी सिनात्रा) पर, मेरे पास एक पोस्ट हैंडलर है, जो सिर्फ JSON सरणी को प्रिंट करता है

post "/prediction"  do
puts request.body.read
end

यह सरणी से पहले एक अजीब स्ट्रिंग "13b2b" के साथ एक अजीब अधूरा जेसन सरणी प्रिंट करता है। प्राप्त डेटा यहां पाया जा सकता है: https://gist.github.com/wenchaojiang/9880181

मुझे यकीन है कि मैंने जो डेटा भेजा है वह एक वैध JSON सरणी है, क्यों sinatra इसे पूरी तरह से प्राप्त नहीं कर सकता है और अजीब "13b2b" कहां से आता है? कोई उपाय?

----------- संपादित करें -------------

नमूना डेटा बड़ा है। इसे यहां पर देख जा सकता है: https://gist.github.com/wenchaojiang/9881235

एक और अजीब बात यह है कि, जब मैं निम्नलिखित node.js सर्वर का उपयोग करता हूं, तो जेसन सही ढंग से प्राप्त किया जा सकता है

http.createServer(function (req, res) {
if (req.method == "POST") {
var queryData = "";
req.on("data", function(data) {
queryData += data;
});

req.on("end", function() {
var obj = JSON.parse(queryData);

console.log(JSON.parse(queryData).payload);

res.writeHead(200, "OK", {"Content-Type": "text/plain"});
res.end();
});
}
}).listen(3001, "0.0.0.0");

----------------- संपादित करें ----------------------------

ऐसा लगता है कि सिनात्रा को 2 मिलेगापोस्ट अनुरोध भी भले ही मैंने इसे केवल node.js तरफ से भेजा था। पहले अनुरोध से ऊपर वर्णित अपूर्ण जेसन प्राप्त सर्वर और दूसरा पोस्ट अनुरोध निम्न त्रुटि का कारण बनता है

!! Invalid request
Invalid HTTP format, parsing fails.
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/request.rb:82:in `execute"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/request.rb:82:in `parse"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/connection.rb:39:in `receive_data"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run_machine"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/backends/base.rb:63:in `start"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/server.rb:159:in `start"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/handler/thin.rb:13:in `run"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/server.rb:265:in `start"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/server.rb:137:in `start"
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/bin/rackup:4:in `<top (required)>"
/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rackup:19:in `load"
/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rackup:19:in `<main>"

उत्तर:

उत्तर № 1 के लिए 1

मुझे लगता है (हालांकि मैं जो भी देख रहा हूं उसे पुन: पेश नहीं कर सकता) यह थिन सर्वर को संभालने के कारण नहीं है खंडित हस्तांतरण एन्कोडेड अनुरोध। नोड फ़ाइल को कई हिस्सों में तोड़ रहा है और प्रत्येक खंड अलग से भेजने की कोशिश कर रहा है। अजीब स्ट्रिंग (13b2b) पहले खंड के आकार का हेक्स वैल्यू है (हालांकि यह वास्तव में आपके गिस्ट में डेटा से मेल नहीं खाता है) और इसे काटा जाता है क्योंकि ग्राहक बाद में बाकी भेजने की उम्मीद कर रहा है।

नोड सर्वर काम करता है क्योंकि यह ठीक से खंडित अनुरोधों को संभालता है, और अन्य (विकृत) अनुरोध जो सिनात्रा देख रहे हैं, निम्नलिखित भाग हैं।

आप अपने सिनात्रा ऐप में किसी अन्य सर्वर का उपयोग करके यह देखने के लिए कोशिश कर सकते हैं कि यह काम करता है या नहीं। वेब्रिक ठीक लगता है:

set :server, "webrick"

संबंधित सवाल
सबसे लोकप्रिय