2009-08-25 14 views
9

Mam stronę z js, które wysyłają dane poprzez XMLHttpRequest i sprawdzają skrypt po stronie serwera dla tego nagłówka, jak wysłać ten nagłówek?Ruby mechanize post z nagłówkiem

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

Co nagłówek jest skrypt po stronie serwera szuka? Może się różnić. Na przykład w Railsach sądzę, że szukam metody, ale niekoniecznie tak będzie w przypadku każdego skryptu PHP, który uderzasz. –

+1

Myślę, że musisz zaakceptować odpowiedź AnimalCode ... – Kris

Odpowiedz

2

Spójrz na documentation.

musisz albo małpa poprawkę lub czerpią swoją klasę od WWW::Mechanize przesłonić metodę post tak że nagłówki niestandardowe są przepuszczane przez prywatnemu metody post_form.

Na przykład

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

znalazłem ten post z wyszukiwarki internetowej (dwa miesiące później, wiem) i po prostu chciałem podzielić się inne rozwiązanie.

Możesz dodać niestandardowe nagłówki bez małpa łatanie Mechanize przy użyciu pre-connect Hak:

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

+0

DUŻO bardziej elegancki! +1 –

+0

Przyszedłem tutaj, szukając sposobu na ustawienie nagłówka Referer. Jednak z _mechanize (2.3) _ pojawia się błąd 'niezdefiniowana metoda 'pre_connect_hooks' dla zer: NilClass (NoMethodError)' – Marcos

+0

@marcos: to sugerowałoby, że twój obiekt 'agent' jest zerowy z pewnych powodów. Czy możesz to sprawdzić? Gdy to naprawisz, okaże się, że Mechanize 2.0 przyjmuje różne argumenty dla lambda - sprawdź najnowsze dokumenty. –

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) 

Powyższy kod działa dla mnie (Mechanize 1.0) jako sposobu uczynienia serwer myśli, że żądanie przychodzi przez AJAX, ale jak stwierdzono w innych odpowiedziach, to zależy od tego, czego szuka serwer, będzie inne dla różnych kombinacji bibliotek frameworków/js.

Najlepiej użyć wtyczki Firefox HTTPLiveHeaders lub HTTPScoop i spojrzeć na nagłówki żądań wysłane przez przeglądarkę i po prostu spróbować i replikować.

3

Wygląda wcześniejszych wersjach Mechanize że lambda mieli jeden argument, ale teraz ma dwa:

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