私は、httpをurl.exists()
でピークを取り、その後、この簡単なバージョン
> g = basicTextGatherer()
> x = curlPerform(url=string, headerfunction=g$update, nobody=TRUE)
> g$value()
[1] "HTTP/1.1 302 Moved Temporarily\r\nLocation: https://comtrade.un.org/api/get?max=50000&type=C&freq=A&px=S2&ps=2010&r=4&p=all&rg=2&cc=AG4&fmt=json\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nDate: Thu, 23 Feb 2017 23:09:13 GMT\r\nAge: 0\r\nConnection: close\r\nVia: 1.1 localhost.localdomain\r\n\r\n"
を書いた:urlはので、私は 'HEAD' メソッド
> string = sub("http", "https", string)
> g = basicTextGatherer()
> x = curlPerform(url=string, headerfunction=g$update, nobody=TRUE)
> g$value()
[1] "HTTP/1.1 405 Method Not Allowed\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nAllow: GET\r\nContent-Length: 73\r\nContent-Type: application/json; charset=utf-8\r\nExpires: -1\r\nServer: Microsoft-IIS/7.5\r\nX-AspNet-Version: 4.0.30319\r\nX-Powered-By: ASP.NET\r\nDate: Thu, 23 Feb 2017 23:11:02 GMT\r\n\r\n"
を試してみました:、httpsにリダイレクトされていますカールオプションnobody
で暗示されていますが、サポートされていません。これは、httr::http_error()
がHEADリクエストを実行しているために失敗する理由です。 HEAD要求をサポートしないというサーバー側の決定だから、ユーザー側では何もできません。
また、1バイト(たとえばRCurl::getURL(string, followlocation=TRUE, range="0-1")
)を取得しようとすることもできますが、サポートされていない可能性もあります(このクエリではなく、クエリ応答全体が返されます)。
ファイルが実際に存在するかどうかをテストする唯一の方法は、ファイルを取得することです。 httr::GET()
、おそらく
tryCatch({
response <- httr::GET(string)
stop_for_status(response)
## ...
}, http_error=function(e) {
## log error or otherwise recover
})
これはおそらくより効率的なソリューションです。クエリが成功した場合、最初にチェックしてからクエリを実行するには2つのネットワークコールが必要ですが、チェックを行わずにクエリを実行するのは1つのネットワークコールだけです。クエリが失敗した場合は、両方のアプローチで単一のネットワーク呼び出しのみが必要で、戻り値も同様にコンパクトです。したがって、最も一般的なシナリオでは、ネットワークコールによって引き起こされる待ち時間を節約します。
'httr :: GET(string)'の内容を調べることができます。例えば、 'httr :: GET(string)[['status_code']]'というクエリのステータスコードを調べることができます。 – SymbolixAU