Как я могу проверить на 503 ошибки перед использованием httr :: content ()? - PullRequest
0 голосов
/ 31 марта 2020

Я столкнулся с ошибкой сервера при использовании httr. Я использую OpenLibrary Books API для извлечения тематических данных для нескольких книг по их ISBN. Этот код работал прекрасно до сегодняшнего дня. Теперь, непоследовательно, я получаю новую волнующую ошибку:

Error: object of type 'externalptr' is not subsettable

Время от времени все работает без помех. Несмотря на то, что я хотел бы на самом деле решить эту проблему и заставить ее работать каждый раз, я думаю, что если это проблема с сервером, мне придется создать функцию, устойчивую к подобным ситуациям. Есть хороший способ проверить, произойдет ли эта ошибка, и вернуть пользовательское сообщение об ошибке, если есть проблема с сервером? Заранее благодарю за помощь.

Вот пример кода, который воспроизводит мою ошибку:

library(httr)
library(curl)
library(purrr)

# ISBNs. The second one is the only one with data available
x <- c("0735224633", "0679745580", "1476746583", "") 

subj_list <- list()

for(i in 1:length(x)){
  isbn <- x[i]
  if(isbn =='') {
    subj_list[[i]] = NA} else{ # if missing isbn, return NA
  r <- httr::GET(paste('https://openlibrary.org/api/books?bibkeys=ISBN:',
                           isbn,
                           '&jscmd=data&format=json',sep=''))
  rl <- httr::content(r, "parsed")
  if(length(rl)==0){subj_list[[i]] = NA}else{ # if no info avail, return NA
    ilist <- rl[[1]]$subjects #get list of subjects for book i
    subj_list[[i]] <- unlist(purrr::map(ilist,'name')) 
  }
  }
}

Вторая книга в списке - единственная, в которой имеются данные о предметах, доступные из OpenLibrary. Поэтому, когда код работает , он возвращает следующий список:

> subj_list
[[1]]
[1] NA

[[2]]
 [1] "Cas, Études de"                     "Murder"                             "Meurtre"                           
 [4] "Análisis de casos"                  "Asesinato"                          "Case studies"                      
 [7] "Murder -- Kansas -- Case studies."  "Crime"                              "Smith, Perry Edward, 1928-1965"    
[10] "Kansas"                             "Hickock, Richard Eugene, 1931-1965"

[[3]]
NULL

[[4]]
[1] NA

Вот моя информация о сеансе:

R version 3.6.3 (2020-02-29) Platform: x86_64-apple-darwin15.6.0 (64-bit) Running under: macOS Catalina 10.15.4

Matrix products: default BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib

locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages: [1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages: [1] purrr_0.3.3 curl_4.3    httr_1.4.1 

loaded via a namespace (and not attached): [1] compiler_3.6.3 magrittr_1.5   R6_2.4.1       tools_3.6.3    Rcpp_1.0.4     xml2_1.2.5 jsonlite_1.6.1 [8] packrat_0.5.0  rlang_0.4.5

1 Ответ

0 голосов
/ 31 марта 2020

Проверьте код состояния, прежде чем пытаться получить доступ к контенту (с ошибкой сервера, такой как 503, там, скорее всего, нет контента)

if(httr::status_code(r) != 200) stop("Error has occurred")

Вы можете сделать проверку кода состояния настолько сложной, как вы хотите, с различными пользовательскими сообщениями об ошибках (может быть другим для ошибок сервера 500 и одним для ошибок пользователя 400)

Список кодов HTTP

...