Wrap API https request in new apiCall method
Also added: timeout and userAgent slots in KorAPConnection and output of error and warning messages.
Change-Id: I76159941a9fc56d31a560b84cc295419f52c3503
diff --git a/R/KorAPConnection.R b/R/KorAPConnection.R
index a890d3f..a84bbb1 100644
--- a/R/KorAPConnection.R
+++ b/R/KorAPConnection.R
@@ -10,12 +10,14 @@
#'
#' @export
-KorAPConnection <- setClass("KorAPConnection", slots=c(KorAPUrl="character", apiVersion="character", apiUrl="character", verbose="logical"))
+KorAPConnection <- setClass("KorAPConnection", slots=c(KorAPUrl="character", apiVersion="character", apiUrl="character", userAgent="character", timeout="numeric", verbose="logical"))
#' @param .Object KorAPConnection object
#' @param KorAPUrl the URL of the KorAP server instance you want to access.
#' @param apiVersion which version of KorAP's API you want to connect to.
#' @param apiUrl URL of the KorAP web service.
+#' @param userAgent user agent string.
+#' @param timeout time out in seconds.
#' @param verbose logical decides wether following operations will default to be verbose
#' @return \code{\link{KorAPConnection}} object that can be used e.g. with \code{\link{corpusQuery}}
#'
@@ -29,7 +31,7 @@
#' @rdname KorAPConnection-class
#' @export
setMethod("initialize", "KorAPConnection",
- function(.Object, KorAPUrl = "https://korap.ids-mannheim.de/", apiVersion = 'v1.0', apiUrl, verbose = FALSE) {
+ function(.Object, KorAPUrl = "https://korap.ids-mannheim.de/", apiVersion = 'v1.0', apiUrl, userAgent = "R-KorAP-Client", timeout=10, verbose = FALSE) {
.Object <- callNextMethod()
m <- regexpr("https?://[^?]+", KorAPUrl, perl = TRUE)
.Object@KorAPUrl <- regmatches(KorAPUrl, m)
@@ -42,10 +44,39 @@
.Object@apiUrl = apiUrl
}
.Object@apiVersion = apiVersion
+ .Object@userAgent = userAgent
+ .Object@timeout = timeout
.Object@verbose = verbose
.Object
})
+setGeneric("apiCall", function(kco, ...) standardGeneric("apiCall") )
+
+#' @aliases apiCall
+#' @rdname KorAPConnection-class
+#' @param kco KorAPConnection object
+#' @param url request url
+setMethod("apiCall", "KorAPConnection", function(kco, url) {
+ resp <- GET(url, user_agent(kco@userAgent), timeout(kco@timeout))
+ if (http_type(resp) != "application/json") {
+ stop("API did not return json", call. = FALSE)
+ }
+ parsed <- jsonlite::fromJSON(content(resp, "text"))
+ if (!is.null(parsed$warnings)) {
+ message <- ifelse (nrow(parsed$warnings) > 1,
+ sapply(parsed$warnings, function(warning) paste(sprintf("%s: %s", warning[1], warning[2]), sep="\n")),
+ sprintf("%s: %s", parsed$warnings[1], parsed$warnings[2]))
+ warning(message, call. = FALSE)
+ }
+ if (status_code(resp) != 200) {
+ message <- ifelse (!is.null(parsed$errors),
+ sapply(parsed$errors, function(error) paste0(sprintf("\n%s: KoRAP API request failed: %s", error[1], error[2]))),
+ message <- sprintf("%s: KoRAP API request failed.", status_code(resp)))
+ stop(message, call. = FALSE)
+ }
+ parsed
+})
+
#' @rdname KorAPConnection-class
#' @param object KorAPConnection object
#' @export
@@ -54,12 +85,11 @@
cat("apiUrl: ", object@apiUrl, "\n")
})
-#' Funtion KorAPConnection()
-#'
-#' Wrappper function for new("KorAPConnection")
-#'
-#' @rdname KorAPConnection-constructor
-#' @name KorAPConnection-constructor
-#' @export
-# KorAPConnection <- function(...) new("KorAPConnection", ...)
-
+##' Funtion KorAPConnection()
+##'
+##' Wrappper function for new("KorAPConnection")
+##'
+##' @rdname KorAPConnection-constructor
+##' @name KorAPConnection-constructor
+##' @export
+## XKorAPConnection <- function(...) new("KorAPConnection", ...)