加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用Ruby Mechanize设置POST请求的主体?

发布时间:2020-12-17 03:41:25 所属栏目:百科 来源:网络整理
导读:如何使用 Ruby Mechanize gem设置POST请求的主体.我知道你能做到 mechanize.post(url,query,headers) 但我想用JSON字符串设置POST请求的主体.那可能吗?所以,类似于jQuery这样的东西: $.ajax({ type: 'POST',url: 'myurl',data: "{'key1':'value1','key2':'
如何使用 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)

……你的既定目标是:

I want to set the body of the POST request

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’,机械化文档说明了查询参数:

The query is specified by either a string,or

a list of key-value pairs represented by a hash,or

an array of arrays.

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.
>告诉服务器post请求的主体使用json密码.

像这样:

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,因为它使用属性和值周围的单引号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读