如何编写sinatra API以从AngularJS $ http接收POST

时间:2014-10-09 04:59:07

标签: ruby json angularjs post sinatra

      $http({
       method: "POST",
       url: "http://myapp.herokuapp.com/angular",
       data: {message: $scope.newChat}
      })

我认为如果我启用它来接收JSON,那就没问题了,但是我仍然在OPTIONS方法中遇到404错误:

require 'rubygems'
require 'sinatra'
require 'sinatra/json'
require 'json'

post '/angular' do

 data = JSON.parse(request.body.read)
 json data

end

但它没有用。我需要在angularJS端和sinatra服务器端进行更改才能接受帖子并将响应发送回客户端?

1 个答案:

答案 0 :(得分:1)

我正在假设这是一个交叉来源请求。如果是这种情况,由于安全原因,默认情况下禁用CORS;应该如此。

您需要启用CORS;在Sinatra我通常使用sinatra-cross_origin扩展。

sinatra-cross_origin

要为整个服务启用CORS,您可以使用以下内容。

require 'sinatra'
require 'sinatra/cross_origin'

configure do
  enable :cross_origin
end

要仅启用特定路线,它看起来更像是如下。

get '/cross_origin' do
  cross_origin
  "This is available to cross-origin javascripts"
end

确保您意识到这会带来很大的安全风险,并且您正在适当地降低风险。

以下示例将允许连接任何源,在开放式Web服务的情况下可能是您需要的。

set :allow_origin, :any

另一方面,如果可能,你可以限制它

set :allow_origin, 'http://example.com'

如果您需要将其作为完整的Web服务打开到任何来源,那么您将需要考虑其他安全措施,如TLS和OAuth,但这有点超出了这个问题的范围。