2009-08-25 14 views
9

Ho una pagina con js che registra i dati tramite XMLHttpRequest e il controllo degli script lato server per questa intestazione, come inviare questa intestazione?Ruby mechanize post con intestazione

agent = WWW::Mechanize.new { |a| 
    a.user_agent_alias = 'Mac Safari' 
    a.log = Logger.new('./site.log') 
} 

agent.post('http://site.com/board.php', 
    { 
    'act' => '_get_page', 
    "gid" => 1, 
    'order' => 0, 
    'page' => 2 
    } 
) do |page| 
    p page 
end 
+0

Che colpo di testa è lo script lato server cercando? Può variare. Ad esempio, in Rails credo che _method sia cercato, ma questo non sarà necessariamente il caso con qualunque script PHP stai colpendo. –

+1

Penso che tu debba accettare una risposta AnimalCode ... – Kris

risposta

2

Dai uno sguardo allo documentation.

è necessario o scimmia-patch o derivano la propria classe da WWW::Mechanize l'override del metodo post in modo che le intestazioni personalizzate sono passati attraverso il metodo privato post_form.

Per esempio,

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

Ho trovato questo post con una ricerca sul web (due mesi più tardi, lo so) e volevo solo condividere un'altra soluzione.

È possibile aggiungere intestazioni personalizzate senza scimmia patching Mechanize utilizzando un gancio pre-connect:

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

+0

MOLTO più elegante! +1 –

+0

Sono venuto qui cercando un modo per impostare l'intestazione Referer. Comunque con _mechanize (2.3) _ ottengo l'errore 'metodo non definito 'pre_connect_hooks' per nil: NilClass (NoMethodError)' – Marcos

+0

@marcos: ciò suggerirebbe che l'oggetto 'agente' è nullo per alcune ragioni. Puoi controllare quello? Una volta risolto ciò, scoprirai che Mechanize 2.0 accetta diversi argomenti per il lambda - controlla gli ultimi documenti. –

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) 

Il codice precedente funziona per me (meccanizzare 1.0) come un modo per rendere il il server pensa che la richiesta arrivi tramite AJAX, ma come indicato in altre risposte dipende da cosa il server sta cercando, sarà diverso per combinazioni di framework framework/js differenti.

La cosa migliore da fare è utilizzare il plug-in Firefox HTTPLiveHeaders o HTTPScoop e osservare le intestazioni delle richieste inviate dal browser e provare e replicare.

3

Sembra che le versioni precedenti di Mechanize che lambda aveva un solo argomento, ma ora ha due:

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