我能够成功地从AngularJS发布到我的Sinatra路线,这样我得到了一个" 200"状态。
当我在Chrome中检查时,我看到请求有效负载如下:
{"input":"testing"}
但回应是空的。
以下是我的发布方式:
$http({
method: "POST",
url: "http://floating-beyond-3787.herokuapp.com/angular",
/*url: "https://worker-aws-us-east-1.iron.io/2/projects/542c8609827e3f0005000123/tasks/webhook?code_name=botweb&oauth=LOo5Nc0x0e2GJ838_nbKoheXqM0",*/
data: {input: $scope.newChat}
})
.success(function (data)
{
// $scope.chats.push(data);
$scope.chats.push($scope.newChat)
// if successful then get the value from the cache?
})
.error(function (data)
{
$scope.errors.push(data);
});
};
$scope.newChat = null
请求有效负载下的Chrome正确显示 - 如上所述。
当我在运行我的Sinatra应用程序的Heroku中检查日志时,我无法判断我是否正确处理请求有效负载。而我在回复中肯定没有得到任何东西:
post '/angular' do
puts "params: #{params}"
puts params[:input]
puts @json = JSON.parse(request.body.read)
return RestClient.post 'https://worker.io' {:send => params[:input]}
end
我的期望是:
这可能吗?如果可以,怎么做?
答案 0 :(得分:0)
可能你遇到的情况是,在你的路线出现之前,我们已经在链上进一步阅读了request.body。
尝试以下
request.body.rewind
request_payload = JSON.parse request.body.read
这是Sinatra遇到的一个相当常见的问题,所以如果这解决了你的问题,你可能想把它放在一个过滤器之前。
before do
request.body.rewind
@request_payload = JSON.parse request.body.read
end
此外,以下内容不适用于JSON有效负载。
params[:input]
如果Content-Type为params[:field]
,application/x-www-form-urlencoded
样式可以使用,以允许以传统的Web应用程序样式访问表单数据。它还可以从参数化路线中拉出参数;如下所示。
post '/angular/:data'
puts params[:data]
# Do whatever processing you need in here
# assume you created a no_errors var to track problems with the
# post
if no_errors
body(json({key: val, key2: val2, keyetc: valetc}))
status 200
else
body(({oh_snap: "An error has occurred!"}).to_json) # json(hash) or hash.to_json should both work here.
status 400 # Replace with your appropriate 4XX error here...
end
end
我最近做的事情是使用最后一个样式post 'myroute/:myparam
,然后Base64在客户端编码JSON有效负载并将其发送到URL:myparam slot。这有点像黑客,并不是我推荐的一般做法。我有一个客户端应用程序无法正确编码请求体中的JSON数据+标头;所以这是一个可行的解决方法。