如何将对AngularJS $ http POST的响应返回给Sinatra?

时间:2014-10-10 03:29:16

标签: ruby angularjs heroku sinatra

我能够成功地从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

我的期望是:

  1. Sinatra应用可以接收有效载荷:输入
  2. 它可以在iron.io
  3. 上成功发布给我的工作人员
  4. 它可以在Response to Angular JS中返回一些内容以及Success。
  5. 这可能吗?如果可以,怎么做?

1 个答案:

答案 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数据+标头;所以这是一个可行的解决方法。