2017-01-31 7 views
2

Ich verwende derzeit Chefkoch, um ein Kochbuch aufzubauen, die eine Reihe von POST-Aufrufe an diese API auslösen muss, und ich muss die Antwort in einer Variablen erfassen, um es in einem zweiten HTTP zu verwenden Anruf.Capture HTTP Call Response mit Chef

Ich habe versucht, die http_request Ressource von Ruby verwenden, aber ich kann nur den Anruf ausgelöst, aber nicht wissen, wie die Reaktion eingefangen werden:

http_request 'authorize' do 
action :post 
url '*****************************' headers ({ 
     'Content-Type' => 'application/json' 
     }) message ({ 
     :Username => "**********", 
     :Password => "**********" 
     }).to_json 
end 

In einem weiteren Versuch habe ich versucht, Chef des http-Client abzufeuern einen POST-Anruf und ein eine Antwort erhalten:

require "net/https" 
    require "uri" 
    require "json" 
    uri = URI("******************************") 
    req = Net::HTTP::Post.new(uri) 
    req.set_form_data("Username" => "********", "Password" => "*********") 

    res = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(req) 
    end 

    case res 
    when Net::HTTPSuccess, Net::HTTPRedirection 
    # OK 
    else 
    res.value 
    end 

Aber ich halte immer diese Fehlermeldung, wenn ich den Koch-Client auf meinem Knoten ausgeführt:

EOFError 
-------- 
end of file reached 

Wie kann ich einen POST-Anruf mit Chef/Ruby abschicken und seine Antwort erfassen?

+0

Haben Sie eine Lösung gefunden? – inquisitive

+0

@inquisitive Nein noch nicht – ehjay

Antwort

1

Sie möchten die Chef::HTTP Client-Klasse verwenden, siehe https://coderanger.net/chef-tips/#4 für ein Beispiel.

+0

Hallo, wären Sie in der Lage, ein konkreteres Beispiel zu geben, wie Sie die Antwort zurückerhalten können? Die Antwort meines Aufrufs gibt zwei Objekte zurück, APIKey und ValidUntil, und ich muss den APIKey-Wert erfassen. my_id = Chef :: HTTP.new ('https: // cmdb /') .post ('/') Würde mein my_id die Antwort, die von meinem Postanruf zurückgegeben wird, gleichwertig sein? – ehjay

+0

Ja, du bekommst einen String zurück, der der Körper der Antwort ist. – coderanger

+0

Also habe ich den Anruf zur Arbeit bekommen und ich bekomme die Antwort als Text zurück. Weißt du, wie man es als Array zurückbekommt, damit ich nur EINEN Wert in der Antwort analysieren kann? Zum Beispiel, wenn die Antwort ist {A: asdasda, B: asdasdasd} Ich bin nur daran interessiert, den A-Wert zu bekommen – ehjay