2009-08-25 17 views
9

tengo página con js que publican datos a través de XMLHttpRequest y verificación de script del lado del servidor para esta cabecera, cómo enviar esta cabecera?Rubí mecanizar post con cabecera

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

Lo cabecera es el script del lado del servidor buscando? Puede variar Por ejemplo, en Rails creo que se está buscando _method, pero ese no necesariamente será el caso con cualquier script PHP que se esté ejecutando. –

+1

Creo que debe aceptar una respuesta AnimalCode ... – Kris

Respuesta

2

Eche un vistazo a documentation.

Necesitas ya sea mono-parche o derivar su propia clase de WWW::Mechanize reemplazar el método post por lo que los encabezados personalizados se pasan a través del método privada post_form.

Por ejemplo,

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

me encontré con este post con una búsqueda en Internet (dos meses más tarde, lo sé) y sólo quería compartir otra solución.

Puede agregar encabezados personalizados sin mono parches Mechanize utilizando un gancho pre-connect:

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

+0

MUCHO más elegante! +1 –

+0

Vine aquí buscando una forma de configurar el encabezado Referer. Sin embargo, con _mechanize (2.3) _ consigo el error 'método no definido '' para pre_connect_hooks nula: NilClass (NoMethodError)' – Marcos

+0

@marcos: Eso hace pensar que su 'agent' objeto es nulo por algunas razones. ¿Puedes verificar eso? Una vez que arregle eso, encontrará que Mechanize 2.0 toma diferentes argumentos para el lambda - verifique los últimos documentos. –

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) 

El código anterior funciona para mí (Mechanize 1.0) como una manera de hacer que el el servidor piensa que la solicitud proviene de AJAX, pero como se indica en otras respuestas, depende de lo que el servidor esté buscando, será diferente para los diferentes combos de bibliotecas frameworks/js.

Lo mejor que puede hacer es usar Firefox HTTPLiveHeaders plugin o HTTPScoop y mirar las cabeceras de petición enviado por el navegador y simplemente tratar de replicar eso.

3

Parece que las versiones anteriores de Mechanize que lambda tenía un argumento, pero ahora tiene dos:

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