2017-02-03 1 views
1

Also, ich bin zu dem Punkt gekommen, dass ich nicht sicher bin, welche Frage ich bei der Recherche meines Problems noch stellen muss. Also, indem ich hierher komme, frage ich 2 Dinge.Json API Curl zu HTTParty Anfrage. Die Anfrage funktioniert auf meinem lokalen Rechner mit cURL, aber nicht in Heroku-Produktion mit HTTParty

Erstens, wie bekomme ich in Zukunft solche Probleme zu untersuchen? Zweitens, was mache ich gerade falsch?

Grundsätzlich habe ich eine App erstellt und schob es nach Heroku. Diese App hat API-Endpunkte, die genau so funktionieren, wie ich es erwarte, wenn ich die App lokal ausführe und curl-Befehle über mein Terminal sende. Der Code, den ich versuche, mich in meiner App anzumelden, verwendet das HTTP-Juwel und gibt {"status":500,"error":"Internal Server Error"} zurück.

Also, das ist das erste Mal, dass ich versuche, mich mit irgendeinem API-Endpunkt zu verbinden, also fliege ich hier ein wenig im Dunkeln. Was ich über einen 500-Fehler gelesen habe, ist: "Wenn alles andere fehlschlägt, wird im Allgemeinen eine 500-Antwort verwendet, wenn die Verarbeitung aufgrund unvorhergesehener Umstände auf der Serverseite fehlschlägt, wodurch der Server einen Fehler verursacht." Was klingt ein wenig wie ein Catch-All für etwas kaputt, aber wir wissen nicht was, außer es ist auf dem Backend. Bitte korrigieren Sie mich, falls ich falsch liege.

Was mache ich als nächstes?

Dies ist der curl Befehl Ich bin mit eine E-Mail und Passwort senden zu empfangen und auth_token:

{"auth_token":"628f3ebc47193665e7f1d32ae41ff9a7"}% 

Dies ist der Code, den ich: Ich habe diesen zurück

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

Wie erwartet Ich benutze HTTParty, um eine Verbindung zu meinem API herzustellen, wenn ich mit Heroku in der Produktion arbeite:

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 

Dies ist die Antwort zurück:

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

auf meine Fragen zu wiederholen sind, was kann ich von dieser Antwort nehmen weiter untersuchen zu beginnen? Welche Fragen sollte ich mir stellen, wenn das passiert?

Zweitens, was habe ich falsch gemacht?

Vielen Dank im Voraus für Ihre Hilfe.

Edit:

Ein kurzes Update ist, dass ich die Locke Befehl ausgeführt wurde, die lokal mit der tatsächlichen URL für meine Produktionsstätte gearbeitet und es hat funktioniert genau so, wie es vor Ort der Fall ist. Ich komme immer noch nicht dazu, mit HTTParty weiter zu kommen.

überprüfte ich meine heroku logs und fanden diese:

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' 

Welche 7 meiner SessionsController Linie zeigt:

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

Linie 7 hat zwei Arrays drin, aber ich bin nicht sicher, wie sie in der Httpary-Anfrage leer sind und nur in der Curl-Anfrage finden.

+0

'params [: user_login] [: email]' -> 'params [: E-Mail] 'weil' {"email" => "[email protected]", "password" => "[FILTERED]"} 'hat kein': user_login' – phoet

+0

Danke für das Kommentieren. Ich habe eine Weile gebraucht, um herauszufinden, wie ich das: user_login bereitstellen kann. – Lenocam

Antwort

0

Die Antwort auf meine erste Frage, was ich tun sollte, wenn ich auf dieses Problem stoße oder eines wie es wieder ist, ist überprüfen Sie die Heroku Protokolle. Das hat meine Probleme gelöst. Der zweite Teil dieser Antwort ist, dass, selbst als ich herausfand, dass ich nicht die :user_login Info sendete, ich immer noch nicht herausfinden konnte, wie ich mein Problem beheben konnte, also begann ich, byebug an irgendeinen Ort zu werfen, der mit meinem Problem zusammenhing und fragte Was meine Variablenwerte waren und Code ausführen, um die Ausgabe in der Konsole zu sehen. Als sie kam immer wieder nil kommen, und ich konnte nicht herausfinden, was die richtige Reihenfolge/Art und Weise die HTTParty Anfrage nach rechts, begann ich .methods oder .instance_methods nach meiner Variablen setzen, um mehr Möglichkeiten zu fragen, das zu finden, was hier vor sich geht. Danach habe ich Zeit in der rails-Konsole verbracht und dabei alle instance_methods verwendet, die meinen Variablen zugeordnet waren, bis ich die Teile zusammengefügt habe.

Die Antwort auf meine zweite Frage, was habe ich falsch gemacht? Ich habe nicht gesendet :user_login, hauptsächlich weil ich nicht ganz verstanden habe, was es tun sollte (ich bin neu, ich benutze viele Tutorials, die ich wie 95% verstehe, das war von den 5%) und selbst als ich es tat, konnte ich nicht herausfinden, wie ich es in meine Anfrage schieben sollte. Wie sich herausstellt, habe ich auch nicht :body verwendet. Sobald ich feststelle, dass ich :body um alle Daten setzen muss, die ich sendete, war meine nächste Schicht :user_login, gefolgt von meiner :email und :password, die im Nachhinein vollkommen offensichtlich jetzt aussieht.

Dies ist, was der Code sich anmelden, um meine app wie folgt aussieht:

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