gpt4 book ai didi

具有多部分发布请求的 Ruby Sinatra

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:09:12 25 4
gpt4 key购买 nike

不确定这是否是multi part post request引起的问题。从客户端,我使用 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("\0").join(""));
post_req.end();

在服务器端(ruby sinatra),我有一个后处理程序,它只打印出 JSON 数组

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

它打印出一个奇怪的不完整的json数组,数组前面有一个奇怪的字符串“13b2b”。可以在此处找到收到的数据:https://gist.github.com/wenchaojiang/9880181

我确定我发送的数据是一个有效的 JSON 数组,为什么 sinatra 不能完全接收它以及奇怪的“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');

----------------编辑------------------------

即使我只从 node.js 端发送一次,Sinatra 似乎也会收到 2 个发布请求。服务器从第一个请求和第二个post请求中收到上面提到的不完整的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>'

最佳答案

我认为(虽然我不能准确地重现你所看到的)这是由于瘦服务器没有处理 chunked transfer encoded要求。 Node 将文件分成几个部分并尝试分别发送每个 block 。奇怪的字符串 (13b2b) 是第一个 block 大小的十六进制值(尽管它实际上与 Gist 中的数据不匹配)并且它被切断,因为客户端期望发送剩下的稍后。

Node 服务器可以正常工作,因为它可以正确处理分块请求,而 Sinatra 看到的其他(格式错误的)请求是以下分块。

您可以尝试在您的 Sinatra 应用程序中使用另一个服务器,看看它是否有效。 Webrick 似乎没问题:

set :server, 'webrick'

关于具有多部分发布请求的 Ruby Sinatra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com