通过Ruby发送HTTP post请求

Bil*_*hla 10 ruby ruby-on-rails ruby-on-rails-3

我对ruby和尝试一些基本的东西都很新.当我使用以下命令向服务器发送HTTP请求时:

curl -v -H "Content-Type: application/json" -X GET -d "{"myrequest":"myTest","reqid":"44","data":{"name":"test"}}" localhost:8099
Run Code Online (Sandbox Code Playgroud)

我的服务器将JSON数据视为"{myrequest:myTest,reqid:44,data:{name:test}}"

但是当我使用以下ruby代码发送请求时:

require 'net/http'

@host = 'localhost'
@port = '8099'

@path = "/posts"

@body = ActiveSupport::JSON.encode({
    :bbrequest => "BBTest", 
    :reqid => "44", 
    :data => 
    {
        :name => "test"
    }
})

request = Net::HTTP::Post.new(@path, initheader = {'Content-Type' =>'application/json'})
request.body = @body
response = Net::HTTP.new(@host, @port).start {|http| http.request(request) }
puts "Response #{response.code} #{response.message}: #{response.body}"
Run Code Online (Sandbox Code Playgroud)

它将其视为"{\"bbrequest \":\"BBTest \",\"reqid \":\"44 \",\"data \":{\"name \":\"test \"}} "并且服务器无法解析它.也许我需要设置一些额外的选项来从Ruby发送请求以排除那些额外的字符?

你能帮忙吗?提前致谢.

Jul*_*lik 3

您在 shell 上执行的操作会生成无效的 JSON。你的服务器不应该接受它。

  $echo "{"myrequest":"myTest","reqid":"44","data":{"name":"test"}}"
      {myrequest:myTest,reqid:44,data:{name:test}}
Run Code Online (Sandbox Code Playgroud)

这是带有未转义键和值的 JSON,永远不会工作。 http://jsonlint.com/ 如果您的服务器接受这种“某种 JSON”,但不接受示例中的第二个,则您的服务器已损坏。

我的服务器将 JSON 数据视为“{myrequest:myTest,reqid:44,data:{name:test}}”

您的服务器看到一个字符串。当您尝试将其解析为 JSON 时,它将产生错误或垃圾。

它将其视为 "{\"bbrequest\":\"BBTest\",\"reqid\":\"44\",\"data\":{\"name\":\" test\"}} ”

不,这就是通过 Ruby 打印的方式Object#inspect。您正在某处打印检查的返回值,然后尝试判断它是否是有效的 JSON - 它不是,因为您粘贴的这个字符串是为了粘贴到交互式 ruby​​ 控制台(irb)或 ruby​​ 脚本中,并且它包含内置转义符。您需要查看原始 JSON 字符串,只需打印字符串而不是检查它。

我认为你的服务器要么坏了,要么还没有完成,你的curl示例坏了,你的ruby脚本是正确的,一旦服务器修复(或完成)就会工作。仅仅是因为

  irb(main):002:0> JSON.parse("{\"bbrequest\":\"BBTest\",\"reqid\":\"44\",\"data\":{\"name\":\" test\"}}")
        # => {"bbrequest"=>"BBTest", "reqid"=>"44", "data"=>{"name"=>" test"}}
Run Code Online (Sandbox Code Playgroud)