【问题标题】:HTTP PUT request with Ruby SinatraRuby Sinatra 的 HTTP PUT 请求
【发布时间】:2019-01-30 11:15:10
【问题描述】:

我使用 Ruby 为 PUT 请求创建了一个主体。当我打印出身体时,我没有看到任何问题。但是当我尝试从实际的 PUT 请求中打印出正文时,我开始收到错误。

详细来说,这是我的代码:

@data={param1: "nameserver",
       param2: {code: "XYZ", name: "NAME", start: "2017"}}

  puts "data = #{@data} " #This works fine

    @putResponse = HTTParty.put(base_url,  
                         :body => @data.to_json,
                         :headers => header)

    puts "putResponse.body is #{@putResponse.body}" #This is where I get the error

如您所见,puts "data = #{@data} " 行运行良好。打印出来

data = {:param1=>"nameserver", :param2=>{:code=>"XYZ", :name=>"NAME", :start=>"2017"}}

但是 puts puts "putResponse.body is #{@putResponse.body}" 行不行。这是打印出来的:

putResponse.body is {"errors":[{"message":"The specified resource does not exist."}],"error_report_id":443}

那么这里的问题是什么? (我正在使用 HTTParty 发出我的 PUT 请求)

编辑:

这是我获得主机和标头的方式:

config = JSON.parse(File.read('config.json'))
puts "config: #{config}"

access_token = config['canvas']['access_token']
puts "access_token: #{access_token}"

host = config['canvas']['host']
puts "host: #{host}"

base_url = 'http://#{host}/api/v1/users/self/custom_data/program_of_study'
puts "base_url: #{base_url}"

header = {'Authorization': 'Bearer ' "#{$access_token}", "Content-Type" => 'application/json', 'Accept' => 'application/json'}

【问题讨论】:

    标签: ruby rest sinatra httparty


    【解决方案1】:

    在 Sinatra 中处理 PUT 类似于处理 POST - 这就是为什么这方面的文档可能很少。

    这是一个简单的 Sinatra 端点示例,它接收来自 curl 请求的 PUT 参数:

    # server.rb
    require 'sinatra'
    
    put '/' do
      params.inspect
    end
    

    并使用此 curl 命令对其进行测试:

    $ curl -X PUT -d n=hello http://localhost:4567/
    

    params 哈希将在任何 Sinatra 端点内可供您使用,包括通过任何 HTTP 方法接收的参数。

    响应您的评论,如果不查看您的整个代码,就很难进行调试。 我建议您运行此答案中提供的测试,并逐渐对其进行修改以适合您的实际代码,以了解哪些问题。

    上面的server.rb 运行,下面的测试没有错误:

    # test.rb
    require 'httparty'
    
    data = { 
      param1: "nameserver",
      param2: { code: "XYZ", name: "NAME", start: "2017" }
    }
    
    response = HTTParty.put 'http://localhost:4567/', body: data
    puts response.body
    # => {"param1"=>"nameserver", "param2"=>{"code"=>"XYZ", "name"=>"NAME", "start"=>"2017"}}
    

    【讨论】:

    • 我实际上更改了这个问题的描述以使其更清晰。你能看看,让我知道我做错了什么吗?
    • 我将在有关标题的问题中添加更多信息。
    • 好的,我编辑了这个问题。鉴于更改,您是否认为我的这行代码不正确:@putResponse = HTTParty.put(base_url, :body => @data.to_json, :headers => header)
    • 没有。您可能没有在 Sinatra 中正确定义 /api/v1/users/self/custom_data/program_of_study 路径,或者您对它的请求 (base_url) 发送到真实服务器而不是您的测试服务器。
    • 但是这样写:response = HTTParty.put 'http://localhost:4567/', body: data和这样写:response = HTTParty.put('http://localhost:4567', :body => data)有什么区别吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 2019-09-27
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多