Ошибка TypeError: нет неявного преобразования в Sinatra + JSON.parse - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь настроить веб-хук, следуя этому руководству по GitHub

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 будет массивом?

Обновление Я не мог отнести его к любому из JSON.parse отдельно.Загрузка полезной нагрузки ловушки работает нормально, загрузка JSON из GitHub API работает без сбоев.Каким-то образом он использует их вместе, что не работает.

1 Ответ

0 голосов
/ 25 октября 2018

Возможно, библиотека воспринимает ответ как текст.Попробуйте добавить заголовок Accept.Это сработало для меня:

request ["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]

(EDIT :) Также, используя Net ::HTTP действительно больно.Пожалуйста, проверьте эти библиотеки:

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

...