Ошибка в UseMethod ("http_error") в roadoi - PullRequest
3 голосов
/ 19 марта 2019

Я пытаюсь roadoi получить доступ к Unpaywall из R, но независимо от того, что я пытаюсь сделать запрос, я получаю этот ответ:

Ошибка в UseMethod ("http_error"): нет применимого метода для 'http_error' применяется к объекту класса "c ('simpleError', 'error', 'Условие') "

Запуск methods(http_error) дает мне это:

[1] http_error.character* http_error.integer*   http_error.response*

Может ли это быть вызвано тем, что я за институциональным брандмауэром? (даже в этом случае кажется странным, что это был бы ответ ...)

Есть ли способ обойти это?

1 Ответ

3 голосов
/ 10 апреля 2019

http_error (на самом деле из библиотеки httr) - очень простая функция: она загружает URL-адрес, заданный символом (http_error.character), извлекает ответ (http_error.response) и в конечном итоге просматривает код ответа(http_error.integer).Если код ответа >=400, функция возвращает TRUE, в противном случае FALSE.

Что говорит ваша ошибка, так это то, что вы (или любая функция в вашей цепочке) пытается вызвать http_error для simpleError объект.Я предполагаю, что ваши настройки брандмауэра блокируют запрос.Поскольку запрос заблокирован, базовый httr::RETRY (который вызывается из oadoi_fetch) возвращает ошибку вместо правильного объекта ответа, и http_error видит только этот объект ошибки и прерывает работу.

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

library(roadoi)
Sys.unsetenv(c("HTTP_PROXY", "HTTPS_PROXY"))
oadoi_fetch("10.1038/nature12373", email = "name@whatever.com")
# Error in UseMethod("http_error") : 
#   no applicable method for 'http_error' applied to an object of class
#   "c('simpleError', 'error', 'condition')"

Как только мой прокси настроен правильно, я получаю

Sys.setenv(HTTPS_PROXY = my_proxy, HTTP_PROXY = my_proxy)
oadoi_fetch("10.1038/nature12373", email = "name@whatever.com")
# # A tibble: 1 x 16
#   doi      best_oa_location  oa_locations  data_standard is_oa genre   journal_is_oa journal_is_in_d~ journal_issns  journal_name publisher  title        year  updated    non_compliant authors  
#   <chr>    <list>            <list>                <int> <lgl> <chr>   <lgl>         <lgl>            <chr>          <chr>        <chr>      <chr>        <chr> <chr>      <list>        <list>   
# 1 10.1038~ <tibble [1 x 10]> <tibble [4 x~             2 TRUE  journa~ FALSE         FALSE            0028-0836,147~ Nature       Springer ~ Nanometre-s~ 2013  2019-04-0~

Если проблема действительно в прокси, я бы попробовал следующее, что помогло мне на моей корпоративной машине с Windows, но может зависеть от ваших локальных настроек ИТ:

## get the proxy settings
system("netsh winhttp show proxy")
Sys.setenv(HTTP_PROXY = <the proxy from netsh>, HTTPS_PROXY = <the proxy from netsh>)

На самом деле, вы можете легко воспроизвести ошибку:

httr::http_error(simpleError("Cannot reach the page"))
# Error in UseMethod("http_error") : 
#   no applicable method for 'http_error' applied to an object of class 
#   "c('simpleError', # 'error', 'condition')"
...