TypeError 问题:Sinatra + JSON.parse 中没有隐式转换

TypeError problem: no implicit conversion in Sinatra + JSON.parse

我正在尝试设置网络挂钩,遵循 this GitHub tutorial

require 'sinatra'
require 'json'
require 'net/http'
require 'pp'

set :port, 31415

# Descarga las diferencias hechas para un push
post '/' do
  push = JSON.parse(request.body.read)
  piezas = push["compare"].split("/")
  api_url = "/repos/#{piezas[3]}/#{piezas[4]}/compare/#{piezas[6]}"
  diff = Net::HTTP.get(URI("https://api.github.com#{api_url}"))
  puts diff.class
  pp(JSON.parse(diff))
end

diff.class 打印:

String

而且,事实上,最后一句工作正常,通过 pp 结构打印。但是,打印后,它会产生错误

[2018-10-25 20:00:23] ERROR TypeError: no implicit conversion of Array into String

它没有引用脚本中的任何行,但错误是否可能出现在第一个 JSON.parse 中? request.body.read 会不会是一个数组?

Update 我无法将它单独推到 JSON.parse 中的任何一个。下载挂钩负载工作正常,从 GitHub API 下载 JSON 无需 glithc。不知何故将它们一起使用是行不通的。

图书馆可能将响应视为文本。尝试添加接受 header。这对我有用:

请求["Accept"] = "application/json"

示例:

uri = URI.parse("https://api.github.com")
req = Net::HTTP::Get.new(URI("https://api.github.com/repos/JJ/microservices-broker/compare/d5d39c5db99d...bbbf695d1bf2"))
req["Accept"] = 'application/json'
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
response = http.request(req)
json = JSON.parse(response.body)
json['url']

# or 

json = JSON.parse(response.body, symbolize_names: true)
json[:url]

(编辑:)另外,使用 Net::HTTP 真的很痛苦。请检查这些库:

https://github.com/lostisland/faraday https://github.com/octokit/octokit.rb