Json API卷曲至HTTParty请求.该请求可以在我的本地机器上使用cURL,但不能在Heroku生产中使用HTT



所以,在研究我的问题时,我已经到了不确定该问什么问题的地步。所以来到这里,我要问两件事。

首先,我将来如何着手调查这样的问题?第二,我现在做错了什么?

基本上,我创建了一个应用程序并将其推送给Heroku。当我在本地运行应用程序并通过终端发送curl命令时,这个应用程序有API端点,它们的工作方式与我期望的完全一样。我正在运行的尝试登录应用程序的代码使用HTTPgem,并返回{"status":500,"error":"Internal Server Error"}

所以,这是我第一次尝试连接到任何API端点,所以我在这里有点不知所措。我读到的关于500错误的信息是,"当所有其他错误都失败时;通常,当由于服务器端的意外情况导致处理失败时,会使用500响应,这会导致服务器出错。"这听起来有点像是对坏掉的东西的一种包罗万象的处理,但我们不知道是什么,除了它在后端。如果我错了,请纠正我。

我下一步该怎么办?

这是我正在运行的curl命令,用于发送电子邮件和密码以接收和auth_token:

curl -d "user_login[email]=fake@email.com&user_login[password]=password123" http://localhost:3000/api/v1/sign-in

不出所料,我得到了这个:

{"auth_token":"628f3ebc47193665e7f1d32ae41ff9a7"}% 

这是我正在使用HTTParty运行的代码,试图在生产中使用Heroku:连接我的API

consumer_api.rb

require "rubygems"
require "httparty"
query_hash = { :user_login => "fake@email.com",
:password => "password123" }
response = HTTParty.post("https://fake-heroku-94488.herokuapp.com/api/v1/sign-in", :query => query_hash)
puts response.body, response.code, response.message, response.headers.inspect

这是回复:

{"status":500,"error":"Internal Server Error"}
500
Internal Server Error
{"server"=>["Cowboy"], "date"=>["Fri, 03 Feb 2017 14:49:40 GMT"], "connection"=>["close"], "content-type"=>["application/vnd.api+json; charset=utf-8"], "x-request-id"=>["5d094cee-11a2-4040-abfd-5180f5e46886"], "x-runtime"=>["0.003503"], "vary"=>["Origin"], "content-length"=>["46"], "via"=>["1.1 vegur"]}

重申我的问题是,我可以从这一回应中得到什么来开始进一步调查?当这种情况发生时,我应该问自己什么问题?

第二,我做错了什么?

提前感谢您的帮助。

编辑:

一个快速的更新是,我运行了curl命令,该命令在本地与我的生产站点的实际URL一起工作,它的工作方式与本地完全相同。我仍然无法继续使用HTTParty。

我检查了我的heroku logs,发现了这个:

2017-02-03T17:22:26.576272+00:00 heroku[router]: at=info method=POST path="/api/v1/sign-in" host=fake-heroku-94488.herokuapp.com request_id=9ab76ce0-95f3-4479-8672-874a624c070e fwd="108.11.195.58" dyno=web.1 connect=1ms service=8ms status=500 bytes=265
Started POST "/api/v1/sign-in" for 108.11.195.58 at 2017-02-03 17:22:26 +0000
Processing by Api::V1::SessionsController#create as JSON
Parameters: {"email"=>"fake@email.com", "password"=>"[FILTERED]"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
NoMethodError (undefined method `[]' for nil:NilClass):
app/controllers/api/v1/sessions_controller.rb:7:in `create'

它指向我的会话控制器的第7行:

...
6          def create
7           resource = User.find_for_database_authentication(:email => params[:user_login][:email])
8            return invalid_login_attempt unless resource
...

第7行有两个数组,但我不确定它们在Httpary请求中是空的,在curl请求中是如何找到的。

如果我再次遇到这个问题或类似问题,我应该怎么做的第一个问题的答案是查看Heroku日志。这开始解决我的问题。这个答案的第二部分是,即使我发现我没有发送:user_login信息,我仍然不知道如何解决我的问题,所以我开始将byebug放入与我的问题相关的任何地方,询问我的变量值是什么,并运行代码在控制台中查看输出。当他们不断返回nil,而我不知道什么是正确的顺序/方式来纠正HTTParty请求时,我开始在变量后面放.methods.instance_methods,以找到更多的方法来询问这里发生了什么。在那之后,我花了一些时间在rails控制台中,使用与我的变量相关联的任何instance_methods,直到我把这些部分放在一起。

我第二个问题的答案是,我做错了什么?我没有发送:user_login,主要是因为我不太明白它应该做什么(我是新手,我使用了很多我理解的教程,大约95%,这是5%的教程),即使我发送了,我也不知道如何在我的请求中添加它。事实证明,我也没有恰当地使用:body。一旦我发现我需要将:body放在我发送的所有数据周围,我的下一层是:user_login,然后是:email:password,事后看来,这一点现在非常明显。

这就是登录我的应用程序的代码:

consumer_api.rb

require "rubygems"
require "httparty"
response = HTTParty.post("https://fake-heroku-94488.herokuapp.com/api/v1/sign-in", :body => {:user_login => {:email => "fake@email.com", :password => "password123"}})

puts response.body, response.code, response.message, response.headers.inspect

最新更新