2017-02-23 3 views
0

UN COMTRADEからJSONデータをインポートします。だから、私は有効な国と年のリストを書いた後、ある年が国のデータを含んでいない場合を除いて、うまくいくループを実行します。Rで有効なAPI呼び出しを確認するにはどうすればよいですか? RCurlとhttrは現在役に立ちません

私は私のAPI呼び出しが有効であるので、私はこれを書くかどうかをテストしたい、ということを考える:

library(RCurl) 

# this is an actual valid API call  
string = "http://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" 

url.exists(string, useragent="curl/7.47.0 RCurl/1.95-4.8") 

しかし、さえJSONテキストとしてインターネットブラウザ上に表示することができ、有効な国コードと年のため、R出力は、私が

library(httr) 
!http_error(string) 

行うhttr

url.exists(string, useragent="curl/7.47.0 RCurl/1.95-4.8") 
[1] FALSE 

語りますd取得する[1] FALSE

どのように偽陰性結果を修正できますか?

+0

'httr :: GET(string)'の内容を調べることができます。例えば、 'httr :: GET(string)[['status_code']]'というクエリのステータスコードを調べることができます。 – SymbolixAU

答えて

1

私は、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つのネットワークコールだけです。クエリが失敗した場合は、両方のアプローチで単一のネットワーク呼び出しのみが必要で、戻り値も同様にコンパクトです。したがって、最も一般的なシナリオでは、ネットワークコールによって引き起こされる待ち時間を節約します。

関連する問題