在使用 httr::content() 之前如何检查 503 错误?
How can I check for 503 errors before using httr::content()?
我在使用 httr
时发现 运行 我认为是服务器错误。我正在使用 OpenLibrary Books API 通过 ISBN 提取几本书的主题数据。这段代码直到今天都运行良好。现在,不一致地,我得到了一个令人兴奋的新错误:
Error: object of type 'externalptr' is not subsettable
每隔一段时间,一切都会 运行 顺利。虽然我想真正解决这个问题并让它每次都能正常工作,但我认为如果这是一个服务器问题,我将不得不制作一个对这种情况具有鲁棒性的功能。有没有一种很好的方法来检查是否会发生此错误,如果出现服务器问题,return 自定义错误消息?预先感谢您的帮助。
下面是一些重现我的错误的示例代码:
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 获取主题数据的图书。因此,当代码 起作用时,它 return 如下列表:
> 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
在尝试访问内容之前检查状态代码(服务器错误如 503,那里可能没有内容)
if(httr::status_code(r) != 200) stop("Error has occurred")
您可以根据需要使用不同的自定义错误消息(服务器 500 错误可能不同,用户错误 400 可能不同)
我在使用 httr
时发现 运行 我认为是服务器错误。我正在使用 OpenLibrary Books API 通过 ISBN 提取几本书的主题数据。这段代码直到今天都运行良好。现在,不一致地,我得到了一个令人兴奋的新错误:
Error: object of type 'externalptr' is not subsettable
每隔一段时间,一切都会 运行 顺利。虽然我想真正解决这个问题并让它每次都能正常工作,但我认为如果这是一个服务器问题,我将不得不制作一个对这种情况具有鲁棒性的功能。有没有一种很好的方法来检查是否会发生此错误,如果出现服务器问题,return 自定义错误消息?预先感谢您的帮助。
下面是一些重现我的错误的示例代码:
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 获取主题数据的图书。因此,当代码 起作用时,它 return 如下列表:
> 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
在尝试访问内容之前检查状态代码(服务器错误如 503,那里可能没有内容)
if(httr::status_code(r) != 200) stop("Error has occurred")
您可以根据需要使用不同的自定义错误消息(服务器 500 错误可能不同,用户错误 400 可能不同)