2014-03-30 72 views
1

不確定這是否是由多部分發布請求引起的問題。 從客戶端,我使用node.js發送了一個post請求。該職位的身體是一個JSON陣列Ruby Sinatra帶多部分發布請求

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("\0").join("")); 
post_req.end(); 

在服務器端(紅寶石西納特拉),我有一個後處理程序,它會打印出JSON陣列

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

它打印出一個奇怪的不完整的JSON數組在數組之前有一個奇怪的字符串「13b2b」。 接收到的數據可以在這裏找到:https://gist.github.com/wenchaojiang/9880181

我相信我發送的數據是有效的JSON陣列,爲什麼西納特拉不能完全接受它,哪裏奇怪「13b2b」從何而來?任何想法?

-----------編輯-------------

示例數據很大。它可以在這裏找到: https://gist.github.com/wenchaojiang/9881235

另一個奇怪的是,當我用下面的node.js服務器上,JSON可以被正確接收

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'); 

----------- ------編輯----------------------------

似乎Sinatra會收到2個帖子請求即使我只從node.js端發送過一次。服務器從第一請求和第二請求後上述接受不完整的JSON導致以下錯誤

!! 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>' 
+0

它看起來像你的有效的JSON已經是奇怪,有什麼用'.split'和即時'.join',所以我想這也正是問題。你能告訴我們一些「數據」的例子嗎? –

+0

@Tim我編輯的問題 – GingerJim

+0

Oooh,有趣。 Ruby方面總是隻能得到第一個要點,或者Ruby收到的數據量是多少? –

回答

1

我認爲(雖然我不能重現你看到什麼),這是由於瘦服務器不處理chunked transfer encoded請求。節點正在將文件分成幾個部分,並試圖分別發送每個塊。奇怪的字符串(13b2b)是第一個塊大小的十六進制值(儘管實際上它與Gist中的數據不匹配),並且因爲客戶端希望稍後發送其餘數據而被切斷。

節點服務器的工作原理是它正確處理分塊請求,Sinatra看到的其他(格式錯誤)請求是以下塊。

您可以嘗試在您的Sinatra應用程序中使用另一臺服務器來查看它是否有效。使用WEBrick似乎是好的:

set :server, 'webrick' 
+0

是的,我從webbrick啓動,然後它的作品! – GingerJim