2017-02-03 1 views
1

Donc, je suis arrivé au point que je ne suis pas sûr de la question à poser lors de la recherche de mon problème. Donc, en venant ici, je demande 2 choses.JSON API Curl à HTTParty demande. La requête fonctionne sur ma machine locale avec cURL, mais pas dans la production Heroku avec HTTParty

D'abord, comment puis-je enquêter sur des problèmes comme celui-ci à l'avenir? Deuxièmement, qu'est-ce que je fais mal en ce moment?

Fondamentalement, j'ai créé une application et l'ai poussée à Heroku. Cette application a des points de terminaison API qui fonctionnent exactement comme je le souhaite lorsque j'utilise l'application en local et que j'envoie des commandes curl via mon terminal. Le code que j'utilise pour essayer de me connecter à mon application utilise le gem HTTP et renvoie {"status":500,"error":"Internal Server Error"}. Donc, c'est la première fois que je tente de me connecter à un point de terminaison de l'API, donc je vole un peu dans le noir ici. Ce que je lis à propos d'une erreur 500 est: "Lorsque tout le reste échoue, une réponse 500 est généralement utilisée lorsque le traitement échoue en raison de circonstances imprévues sur le serveur, ce qui provoque une erreur du serveur." Ce qui ressemble un peu à un fourre-tout pour quelque chose de cassé mais nous ne savons pas quoi, sauf sur le backend. Corrigez-moi si j'ai tort, s'il-vous plait.

Que dois-je faire ensuite?

Ceci est la commande curl je suis en cours d'exécution pour envoyer un e-mail et mot de passe pour recevoir et auth_token:

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

Comme prévu, je reçois ce retour:

{"auth_token":"628f3ebc47193665e7f1d32ae41ff9a7"}% 

C'est le code I Je cours en utilisant HTTParty pour essayer de me connecter avec mon API en production en utilisant Heroku:

consume_api.rb

require "rubygems" 
require "httparty" 

query_hash = { :user_login => "[email protected]", 
       :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 

Ceci est la réponse au:

{"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"]} 

Pour réitérer mes questions sont ce que je peux tirer de cette réponse à commencer à enquêter plus loin? Quelles questions devrais-je me poser quand cela se produit?

Deuxièmement, qu'ai-je fait de mal?

Merci d'avance pour votre aide.

Edit:

Une mise à jour rapide est que j'ai couru la commande boucle qui a travaillé localement avec l'URL de mon site de production et cela a fonctionné exactement comme il le fait sur place. Je n'arrive toujours pas à aller plus loin en utilisant HTTParty.

j'ai vérifié mon heroku logs et trouvé ceci:

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"=>"[email protected]", "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' 

qui pointe vers la ligne 7 de mon SessionsController:

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

ligne 7 a deux tableaux dans, mais je ne suis pas sûr comment ils sont vides dans la demande Httpary et juste trouver dans la demande curl.

+0

'params [: user_login] [: email]' '-> params [: email] 'parce que' {"email" => "[email protected]", "mot de passe" => "[FILTERED]"} 'n'a pas': user_login' – phoet

+0

Merci de votre commentaire. Il m'a fallu du temps pour comprendre comment fournir de manière appropriée: user_login. – Lenocam

Répondre

0

La réponse à ma première question de ce que je devrais faire si je me heurte à ce problème ou un autre comme il est à vérifier les journaux Heroku. Cela a commencé le dénouement de mes problèmes. La deuxième partie de cette réponse est que même si j'ai compris que je n'envoyais pas l'information :user_login, je n'arrivais toujours pas à trouver comment résoudre mon problème, alors j'ai commencé à laisser tomber byebug dans n'importe quel endroit lié à mon problème et demandant mes valeurs de variables et le code en cours d'exécution pour voir la sortie dans la console. Quand ils revenaient toujours nil et je ne pouvais pas comprendre ce que le droit commande/chemin à droite la demande de HTTParty, j'ai commencé à mettre .methods ou .instance_methods après mes variables pour trouver d'autres façons de demander ce qui se passe ici. Après cela, j'ai passé du temps dans la console des rails, en utilisant n'importe quelle instance_methods qui étaient associées à mes variables jusqu'à ce que je mette les pièces ensemble.

La réponse à ma deuxième question, qu'est-ce que je fais mal? Je n'envoyais pas :user_login, principalement parce que je ne comprenais pas très bien ce qu'il était censé faire (je suis nouveau, j'utilise beaucoup de tutoriels que je comprends comme 95%, c'était du 5%) et même quand je l'ai fait, je ne pouvais pas comprendre comment le pousser dans ma demande. En fait, je n'utilisais pas non plus :body. Une fois que j'ai compris que je devais mettre :body autour de toutes les données que j'envoyais, ma couche suivante était :user_login puis suivie de :email et :password, ce qui rétrospectivement semble parfaitement évident maintenant.

C'est ce que le code pour vous connecter à mon application ressemble à:

consume_api.rb

require "rubygems" 
require "httparty" 

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


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