9
votes

Ruby Mécaniser Post avec en-tête

J'ai une page avec JS qui post des données via XMLHTTTPRequest and Server Script Cochez votre en-tête, comment envoyer cet en-tête?

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


2 commentaires

Quel en-tête est le script côté serveur à la recherche? Cela peut varier. Par exemple, dans les rails, je crois que _method est recherché, mais cela ne sera pas nécessairement le cas avec tout script PHP que vous frappez.


Je pense que vous devez accepter un animal de réponse ...


4 Réponses :


2
votes

Jetez un coup d'œil au Documentation .

Vous devez Soit monkey-patch ou dérive votre propre cours de www :: mécanise pour remplacer la méthode de manière de sorte que les en-têtes personnalisés soient passés à la méthode privée post_form .

par exemple, xxx


0 commentaires

11
votes

J'ai trouvé cet article avec une recherche sur le Web (deux mois plus tard, je sais) et je voulais juste partager une autre solution.

Vous pouvez ajouter des en-têtes personnalisés sans patching de singe mécanisée à l'aide d'un crochet de pré-raccordement: xxx


4 commentaires

Je suis venu ici à la recherche d'un moyen de définir l'en-tête de référateur. Toutefois, avec Mécaniser (2.3) i Obtenir l'erreur Méthode non définie 'Pre_Connect_hooks' pour NILLCLASS (NOMETHODERROR)


@marcos: Cela suggérerait que votre objet Agent est nul pour certaines raisons. Pouvez-vous vérifier cela? Une fois que vous avez résolu cela, vous constaterez que Mécaniser 2.0 prend des arguments différents pour la Lambda - Vérifiez les derniers docs.


Mon commentaire n'est plus valable après avoir édité cette réponse. Auparavant, je l'ai codé à tort comme une ligne longue comme présentée dans Ver.1, provoquant agent.pre_connect_hooks pour être utilisé avant agent .


Me donne moi Nombre incorrect d'arguments (2 pour 1) , mécanisée-2.7.3 / lib / mécanise / http / agent.rb: 398: In "appel". Utilisé Stackoverflow.com/a/30266454/111995



8
votes
ajax_headers = { 'X-Requested-With' => 'XMLHttpRequest', 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json, text/javascript, */*'}
params = {'emailAddress' => 'me@my.com'}.to_json
response = agent.post( 'http://example.com/login', params, ajax_headers)
The above code works for me (Mechanize 1.0) as a way to make the server think the request is coming via AJAX, but as stated in other answers it depends what the server is looking for, it will be different for different frameworks/js library combos. The best thing to do is use Firefox HTTPLiveHeaders plugin or HTTPScoop and look at the request headers sent by the browser and just try and replicate that.

0 commentaires

4
votes

semble que plus tôt que Lambda avait un argument, mais maintenant, il a deux:

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


0 commentaires