Пакетная вставка в API, используя сообщение в R - PullRequest
1 голос
/ 28 сентября 2019

Я пытаюсь вставить несколько номеров vin в nthsa API.

Мое рабочее решение выглядит так:

vins <- c('4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466',)

for (i in vins){

json  <- fromJSON(paste0('https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValues/',i,'?format=json'))

print(json)


}

Это решение очень медленное.Я попробовал pbapply, тоже самое, потому что он вставляет по одному vin за раз.

Существует опция пакетной вставки, которую я просто не могу понять.Может кто-нибудь, пожалуйста, помогите.

Вот мой код:

data <- list(data='4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466')

json <- toJSON(list(data=data), auto_unbox = TRUE)

result <- POST('https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/', body = data)

Output <- content(result)

Строка номеров vin должна иметь следующий формат: vin; vin; vin; vin;

здесьссылка: https://vpic.nhtsa.dot.gov/api/ (последняя)

Заранее спасибо.

ОБНОВЛЕНИЕ:

Я также пробовал это из некоторых других тем, но не повезло:

headers = c(
  `Content-Type` = 'application/json'
)

data = '[{"data":"4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466"}]'

httr::POST(url = 'https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/', httr::add_headers(.headers=headers), body = data)
print(r$status_code)

Я получаю код состояния 200, но код сервера 500 без данных.

1 Ответ

0 голосов
/ 28 сентября 2019

Я не уверен, возможно ли это.Конечная точка пакета специально ищет словарь для передачи (исключая строковые представления).httr состояния:

тело: должно быть NULL, FALSE, символ, сырье или список

Я пытался использовать библиотеку collections для генерации dict

data <- Dict$new(list(format = 'json', data = "4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466"))

httr неудивительно, что отклонил его как неправильный тип тела.

Я пытался использовать jsonlite для преобразования с:

data <- jsonlite::toJSON(data)

Выход:

Error: No method asJSON S3 class: R6

Я думаю, из-за того, что данные являются environment.

Попытка чтения в строковом словаре в json возвращает no data:

library(httr)
library(jsonlite)

headers = c(
  'Accept' = '*/*',
  'Accept-Encoding' = 'gzip, deflate',
  'Content-Type' = 'application/x-www-form-urlencoded',
  'User-Agent' = 'Mozilla/5.0'
)

data = jsonlite::toJSON('{"format":"json","data":"4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466"}')

r<- httr::POST(url = 'https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/', httr::add_headers(.headers=headers), body = data. encode='json'

print(content(r))

Если мы исследуем преобразованные данные

> data
["{\"format\":\"json\",\"data\":\"4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466\"}"] 

Это больше не структура словаря, которую ожидает сервер.

Итак, я новичок в R, но кажется, что может быть проще просто перейти на Python, который имеет объект словаря, а также библиотеку json, котораяудобно обрабатывает преобразование

строки в json:

import requests,json

url = 'https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/'
data = json.loads('{"format": "json", "data":"4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466"}')
r = requests.post(url, data=data)
print(r.json())

dict

import requests

url = 'https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/'
data = {'format': 'json', 'data':'4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466'}
r = requests.post(url, data=data).json()
print(r)
...