【问题标题】:opal-jquery ajax request sending malformed json stringopal-jquery ajax 请求发送格式错误的 json 字符串
【发布时间】:2015-11-12 11:22:40
【问题描述】:

我正在使用 opal-jquery 向我的后端发送一个 ajax 请求,但是当我尝试在后端访问它时,json 有效负载格式不正确。

当我在后端执行puts @params.to_s 时,它会显示为:

{"{\"username\":\"some_user\", \"password\":\"some_password\"}"=>nil}

所以要获取我必须做的登录详细信息:

@params.each do |k,v|
    login_details = JSON.parse(k)
end

我的前端(蛋白石)提交请求如下所示:

    def handle_login_submit details
    url = "/client/api/auth"
    HTTP.post url, payload: details.to_json, dataType: 'json' do |response|
        case response.status_code / 100
        when 2
            puts response.status_code
            self.login_state = :return_success 
            puts response.json
        when 4
            self.login_state = :return_failed
            puts response.status_code
            puts response.json
        when 5
            self.f_message = {type: :error, message: "There was a server error" }
            self.login_state = :return_failed
        end

    end

end

我绝对知道详细信息的格式正确,所以这不是问题。

我猜到最后,归根结底是是不是

  1. opal-jquery 发送 post 请求不正确

  2. sinatra 不正确地解析请求。

我不确定它是哪一个,但我倾向于相信它是前者,因为在我改用 react.rb 作为前端之前它运行良好。

【问题讨论】:

  • 我会做几件事。首先,我会在 javascript 控制台中查看details,看看它是否是您认为的那样。其次,我会使用 cURL 发送带有您期望的值的请求,并查看您的后端如何处理该请求(或设置规范来执行此操作,提示提示;)其中一个会给您一个想法发生了什么。
  • “我绝对知道细节的格式是正确的,所以这不是问题。”
  • 但除了您的个人主张之外,您没有提供任何证据。考虑到您是有问题的人,也是寻求帮助的人,您可能会考虑对他人少一点批评并收紧问题。祝你在这方面获得进一步的帮助;)
  • 我不是在批评,如果你想让我像对待愚蠢的人一样对待他们并且不能独立思考,那么好吧,我会慢慢说。但我不这样做,因为我希望这个网站上的人有最低限度的智力,所以当我说“我绝对知道细节的格式正确,所以这不是问题”时,我希望人们阅读这篇文章然后去“Op must已经通过控制台进行了一些基本的调试,发现它既是一个 Json 字符串,而且正在发送正确的 Key 值”;或者你是说人们实际上是无能的,需要像白痴一样说话?
  • 我在处理问题时尽量不做假设,这没有帮助,我希望我正在帮助的人能够原谅我对他们的情况缺乏了解——尤其是当它是有责任的时候他们提供尽可能多的信息,而您还没有这样做。更重要的是,看来您的态度问题多于技术问题,希望您尽快解决这两个问题。

标签: ruby json sinatra opalrb react.rb


【解决方案1】:

在听从this 的建议后,我正在做:

before do
  request.body.rewind
  req = request.body.read
  puts req
  puts JSON.parse(req)
end

我能够看到请求按预期正确到达服务器。我不知道为什么,但 sinatra 却在如此遥远的地方破坏了响应,以至于 @params 出现了

{"{\"username\":\"some_user\", \"password\":\"some_password\"}"=>nil}

所以,我到底在做什么

before do
    request.body.rewind
    @request_payload = JSON.parse(request.body.read)
    request.body.rewind
end

在 sinatra 得到任何东西之前读出请求正文,并从 @request_payload 读出我需要的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2012-10-03
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多