2009-08-25 5 views
9

Ich habe Seite mit js, die Daten über XMLHttpRequest und serverseitige Skriptüberprüfung für diesen Header, wie dieser Header senden?Ruby mechanize Post mit Header

+0

Welche Header für die serverseitige Skript sucht? Es kann variieren. Zum Beispiel glaube ich in Rails, dass _method gesucht wird, aber das wird nicht unbedingt der Fall sein, egal welches PHP-Skript Sie schlagen. –

+1

Ich denke, Sie müssen eine Antwort akzeptieren AnimalCode ... – Kris

Antwort

2

Werfen Sie einen Blick auf die documentation.

Sie müssen entweder affe-patch oder eine eigene Klasse von WWW::Mechanize ableiten, um die post-Methode zu überschreiben, damit benutzerdefinierte Header an die private Methode post_form übergeben werden.

Zum Beispiel

class WWW::Mechanize 
    def post(url, query= {}, headers = {}) 
    node = {} 
    # Create a fake form 
    class << node 
     def search(*args); []; end 
    end 
    node['method'] = 'POST' 
    node['enctype'] = 'application/x-www-form-urlencoded' 

    form = Form.new(node) 
    query.each { |k,v| 
     if v.is_a?(IO) 
     form.enctype = 'multipart/form-data' 
     ul = Form::FileUpload.new(k.to_s,::File.basename(v.path)) 
     ul.file_data = v.read 
     form.file_uploads << ul 
     else 
     form.fields << Form::Field.new(k.to_s,v) 
     end 
    } 
    post_form(url, form, headers) 
    end 
end 

agent = WWW::Mechanize.new 

agent.post(URL,POSTDATA,{'custom-header' => 'custom'}) do |page| 
    p page 
end 
11

ich diesen Beitrag mit einer Web-Suche gefunden (zwei Monate später, ich weiß) und wollte nur eine andere Lösung teilen.

agent = WWW::Mechanize.new 
    agent.pre_connect_hooks << lambda { |p| 
    p[:request]['X-Requested-With'] = 'XMLHttpRequest' 
    } 

+0

VIEL eleganter! +1 –

+0

Ich kam hierher, um nach einer Möglichkeit zu suchen, den Referer Header zu setzen. Mit _mechanize (2.3) _ bekomme ich den Fehler 'undefined Methode 'pre_connect_hooks' für nil: NilClass (NoMethodError)' – Marcos

+0

@marcos: das würde vorschlagen, dass Ihr 'agent' Objekt aus irgendwelchen Gründen kein Nil ist. Kannst du das überprüfen? Sobald Sie das behoben haben, werden Sie feststellen, dass Mechanize 2.0 verschiedene Argumente für das Lambda verwendet - überprüfen Sie die neuesten Dokumente. –

8
ajax_headers = { 'X-Requested-With' => 'XMLHttpRequest', 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json, text/javascript, */*'} 
params = {'emailAddress' => '[email protected]'}.to_json 
response = agent.post('http://example.com/login', params, ajax_headers) 

Der obige Code funktioniert für mich (Mechanize 1.0) als eine Möglichkeit, die machen:

Sie können benutzerdefinierte Header ohne Affe Patchen Mechanize mit einem Pre-Connect-Haken hinzufügen Server denken, die Anfrage kommt über AJAX, aber wie in anderen Antworten angegeben, hängt es davon ab, was der Server sucht, wird es für verschiedene Frameworks/js Bibliothek Combos unterschiedlich sein.

Das beste, was zu tun ist, verwenden Sie Firefox HTTPLiveHeaders Plugin oder HTTPScoop und schauen Sie sich die Anfrage Header vom Browser gesendet und versuchen Sie es einfach zu replizieren.

3

Scheint, wie frühere Versionen von Mechanize dass Lambda ein Argument hatte, aber jetzt hat es zwei:

agent = Mechanize.new do |agent| 
    agent.pre_connect_hooks << lambda do |agent, request| 
    request["Accept-Language"] = "ru" 
    end 
end