【问题标题】:Why won't this POST request send a JSON string to the server?为什么这个 POST 请求不会向服务器发送 JSON 字符串?
【发布时间】:2014-12-13 15:04:36
【问题描述】:

我正在使用 Sinatra。我有一个按钮,通过发出 POST 请求将 JSON 格式的字符串发送到服务器。唯一的问题是,JSON 字符串没有到达服务器。

这里是index.erb

<input id="post-button" type="button" value="Send POST request">

这里是script.js

window.onload = function(){
  var btn = document.getElementById('post-button');
  btn.onclick = function(){
    var req = new XMLHttpRequest();
    var reqObj = {
      name: 'Joe',
      age: '100'
    };
    var reqJSON = JSON.stringify(reqObj);

    req.open('POST','/post_target',true);
    req.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
    req.send(reqJSON);
  }
}

最后,main.rb

get '/' do 
    erb :index
end

post '/post_target' do 
    p params
end

当我单击按钮并检查 Firebug 时,我看到浏览器发送了一个 POST 请求。但是当我检查 Ruby 控制台时,它会为params 打印{}。如果它工作正常,我猜params 会以字符串形式显示一个 JSON 对象,以及它会显示的任何其他内容。

我正在我的机器上运行 Sinatra,地址为 http://localhost:4567

我做错了什么?如果我需要使用 jQuery 进行请求,我可以这样做,但是可以使用“vanilla” JavaScript 来完成吗?

【问题讨论】:

  • 嗯...可能是因为您将请求的内容类型设置为 JSON,但实际上发送的是字符串?当您将请求内容类型设置为 application/x-www-form-urlencoded 时会发生什么? (免责声明:我不太确定 Sinatra 的工作原理 - 因此发布评论而不是答案)
  • 不,删除内容类型在代码运行时得到相同的结果。

标签: javascript ruby ajax post sinatra


【解决方案1】:

"params" 最有可能寻找 URL 编码的查询字符串值。您想要帖子的正文内容,而不是参数。

How to parse JSON request body in Sinatra just once and expose it to all routes?

【讨论】:

  • 啊,所以在main.rb 中我需要在request.body.read 上使用JSON.parse()
【解决方案2】:

你需要解析JSON体:

parsed_params = JSON.parse( request.body.read, symbolize_names:true )

【讨论】:

  • 这段代码给了我一个错误:ERROR TypeError: can't convert Array into String
【解决方案3】:

亚历克斯·希尔是对的。他提到的帖子显示了一种解决方法。

另一种方式是使用 rack/contrib:

需要它:

require 'rack'
require 'rack/contrib'

添加中间件

use Rack::PostBodyContentTypeParser

来源:http://jaywiggins.com/2010/03/using-rack-middleware-to-parse-json/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2016-03-08
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多