Ruby: обработка другого ответа JSON, который отличается от ожидаемого - PullRequest
0 голосов
/ 16 мая 2018

Поиск в Интернете и чтение документов, но не смогли найти ответ.Я довольно новичок и изучаю Ruby. Я хотел сделать следующий сценарий.

Сценарий, по сути, выполняет поиск несущей по списку номеров, которые предоставляются через файл CSV.Файл CSV имеет только одну строку с заголовком столбца «число».

Все работает нормально, пока API не выдаст вывод, отличный от других.В этом примере он говорит мне, что одно из чисел в моем файле не является действительным номером США.Это приводит к тому, что мой скрипт перестает работать.

Я смотрю, есть ли способ игнорировать его (я читал о Begin и End, но не смог заставить его работать) или в идеале либо создать отдельный файл с этими ошибками, либо простопоместите данные в основной файл.

Любая помощь будет высоко ценится.Спасибо.

Код Ruby:

require 'csv'
require 'uri'
require 'net/http'
require 'json'


number = 0


CSV.foreach('data1.csv',headers: true) do |row|
    number = row['number'].to_i
    uri = URI("https://api.message360.com/api/v3/carrier/lookup.json?PhoneNumber=#{number}")
    req = Net::HTTP::Post.new(uri)
    req.basic_auth 'XXX' , 'XXX'
    res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) {|http|
    http.request(req)
    }
    json = JSON.parse(res.body)
    new = json["Message360"]["Carrier"].values


    CSV.open("new.csv", "ab") do |csv|
        csv << new
    end
end

Данные файла:

number
5556667777
9998887777

Пример хорошего ответа в JSON:

{"Message360"=>{"ResponseStatus"=>1, "Carrier"=>{"ApiVersion"=>"3", "CarrierSid"=>"XXX", "AccountSid"=>"XXX", "PhoneNumber"=>"+19495554444", "Network"=>"Cellco Partnership dba Verizon Wireless - CA", "Wireless"=>"true", "ZipCode"=>"92604", "City"=>"Irvine", "Price"=>0.0003, "Status"=>"success", "DateCreated"=>"2018-05-15 23:05:15"}}}

Ответ, вызывающий остановку скрипта:

{
    "Message360": {
        "ResponseStatus": 0,
        "Errors": {
            "Error": [
                {
                    "Code": "ER-M360-CAR-111",
                    "Message": "Allowed Only Valid E164 North American Numbers.",
                    "MoreInfo": []
                }
            ]
        }
    }
}

1 Ответ

0 голосов
/ 16 мая 2018

Может показаться, что сначала вы можете просто проверить json["Message360"]["ResponseStatus"] на 0 или 1, чтобы указать неудачу или успех.

Я бы, вероятно, добавил rescue, чтобы помочь отловить любые другие ошибки (искаженный JSON,проблема сети и т. д.)

CSV.foreach('data1.csv',headers: true) do |row|
    number = row['number'].to_i
...
    json = JSON.parse(res.body)
    if json["Message360"]["ResponseStatus"] == 1  
        new = json["Message360"]["Carrier"].values

        CSV.open("new.csv", "ab") do |csv|
            csv << new
        end
    else
        # handle bad response
    end
rescue StandardError => e
    # request failed for some reason, log e and the number?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...