如何使用Ruby Mechanize设置POST请求的主体?
如何使用
Ruby Mechanize gem设置POST请求的主体.我知道你能做到
mechanize.post(url,query,headers) 但我想用JSON字符串设置POST请求的主体.那可能吗?所以,类似于jQuery这样的东西: $.ajax({ type: 'POST',url: 'myurl',data: "{'key1':'value1','key2':'value2'}",... }); 解决方法
我不太喜欢你在评论中链接到的答案,因为它使用to_json()这是一个rails方法,而你问题的标签并不表示你的问题属于rails.无论如何,我认为答案需要一些讨论.
这是机械化方法: Mechanize#post(url,headers) ……你的既定目标是:
Mechanize#post()允许您将请求的主体设置为您想要的任何内容,但您还必须考虑以下问题: What is the server side expecting? 您给出了一个jquery ajax()请求示例,表示您要执行的操作.发送ajax()请求时,jquery使用以下默认Content-Type标头: application/x-www-form-urlencoded; charset=UTF-8 这告诉服务器,post请求的主体将被写入特定的密码.嗯,这不是什么秘密;它看起来像这样: name1=val1&name2=val2 该密码的名称是x-www-form-urlencoded.因为服务器在Content-Type标头中被赋予了密码的名称,所以服务器知道如何读取post请求的主体. 在Mechanize#post()方法中,第二个参数是’query’,机械化文档说明了查询参数:
http://rubydoc.info/gems/mechanize/Mechanize#post-instance_method 如果要在Mechanize#post()请求的主体中使用名为x-www-form-urlencoded的密码,则可以提供具有名称/值对的哈希,例如: my_hash = { 'data' => '{"key1":"value1","key2":"value2"}' } 然后你像这样调用Mechanize#post(): my_agent.post( 'http://target_site.com',my_hash,{'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8'},) 然后,Mechanize将使用名为x-www-form-urlencoded的密码将“查询”哈希转换为字符串,并将该字符串插入到post请求的主体中.在服务器端,接收post请求的应用程序可以检索json字符串,执行以下操作: json_str = post_variables['data'] 您应该知道,还有其他密码可用于发布请求的正文.其中一个叫做json,它是一个使用javascript语法格式化的字符串,例如: '{ "id": 1,"name": "A green door","price": 12.50,"tags": ["home","green"] }' 请注意没有’=’标志或’&’ json格式的符号 – 因为有x-www-form-urlencoded格式,所以json密码与x-www-form-urlencoded密码有很大不同. 如果您想在帖子请求的正文中使用json密码,则在调用Mechanize#post(url,headers)时需要更改两件事: >为’query’参数提供String. 像这样: json_str = '{"key1":"value1","key2":"value2"}' my_agent.post( 'http://target_site.com',json_str,{'Content-Type' => 'application/json'},) 为查询参数传递String参数时,在将String插入post请求的主体之前,Mechanize不会对String进行任何处理.在服务器端,接收post请求的应用程序可以通过执行以下操作来检索json字符串: json_str = request.body.read #Then probably: hash = JSON.parse(json_str) 一个问题是服务器可以忽略Content-Type标头,并尝试使用已经决定的密码来读取post请求的主体.如果您的发布请求的正文未写入服务器所需的密码,那么您将收到错误消息. 请注意,您发布的“数据”字符串无效json,因为它使用属性和值周围的单引号. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |