1

Ich verwende HTTParty für HTTP-Anfragen und für die Verwendung von REST-APIs. Jetzt möchte ich die Cookies wiederverwenden, die auf einer Login-Seite eingestellt sind, die ich über POST angerufen habe.HTTP-Header 'set-cookie' mit HTTParty analysieren

class SomeImporter 
    include HTTParty 

    def self.login 
    response = self.post('https://www.example.com/login', :query => {:user => 'myusername', :password => 'secret'}) 
    self.default_cookies.add_cookies(response.header['set-cookie']) 
    self.get('https://www.example.com/protected') 
    end 
end 

Die Cookies sind mit diesem Code nicht richtig eingestellt. Wie kann der von HTTParty angegebene Header 'set-cookie' korrekt analysiert werden und die Cookies für die nächste Anfrage gesetzt werden?

Antwort

2

Normalerweise gibt es einen einzigen Eintrag für jeden Set-Cookie im HTTP-Header. HTTParty führt sie in einer einzigen Zeichenfolge als kommagetrennte Liste zusammen. Aber HTTParty teilt sie nicht selbst auf, wenn sie zu Standard-Cookies hinzugefügt werden. Sie müssen sie selbst analysieren.

Es ist möglich, den 'set-cookie' mit der folgenden Methode zu analysieren. Fügen Sie es Ihrer Klasse:

# Parse the 'set-cookie' string 
# @param [String] all_cookies_string 
# @return [Hash] 
def self.parse_set_cookie(all_cookies_string) 
    cookies = Hash.new 

    if all_cookies_string.present? 
    # single cookies are devided with comma 
    all_cookies_string.split(',').each { 
     # @type [String] cookie_string 
     |single_cookie_string| 
     # parts of single cookie are seperated by semicolon; first part is key and value of this cookie 
     # @type [String] 
     cookie_part_string = single_cookie_string.strip.split(';')[0] 
     # remove whitespaces at beginning and end in place and split at '=' 
     # @type [Array] 
     cookie_part   = cookie_part_string.strip.split('=') 
     # @type [String] 
     key     = cookie_part[0] 
     # @type [String] 
     value    = cookie_part[1] 

     # add cookie to Hash 
     cookies[key] = value 
    } 
    end 

    cookies 
end 

Die Cookies HTTParty hinzugefügt werden können für Anfragen folgende durch diese Linie eingestellt:

self.default_cookies.add_cookies(self.parse_set_cookie(response.header['set-cookie'])) 

Innerhalb self.parse_set_cookie die Cookies extrahiert werden nur mit Namen und Wert. Man könnte es erweitern, um mehr Details wie Path, Domain und so weiter zu bekommen. Weitere Informationen finden Sie unter RFC 2109 (4.2.2 Set-Cookie-Syntax).

0
def cookies_to_hash(acookies) 
    vs = acookies.split(',') 
    ak = Array.new 
    # Avoiding break in expiry date comma 
    vs.each_cons(2) do |v, vn| 
     unless(vn.include?("=")) 
      ak << "#{v}#{vn}" 
     else 
      ak << v if(v.include?("=")) 
     end 
    end 
    # Cookies as array of hashes 
    all_cookies = [] 
    ak.each do |each_cookie| 
     ecookie = [] 
     each_cookie.split(';').each do |cookie_attr| 
      ecookie << cookie_attr.split("=") 
     end 
     all_cookies << Hash[ecookie] 
    end 
    all_cookies 
end 

Die obige Methode werden Sie Set-Cookies in Response-Header in eine gültige Array von Hashes helfen konvertieren. Behandelte Probleme mit zusätzlichen Kommas beim Ablauf.