mirror of https://github.com/Xe/xesite_android
50 lines
1.7 KiB
Kotlin
50 lines
1.7 KiB
Kotlin
package website.christine.xesite
|
|
|
|
import com.android.volley.NetworkResponse
|
|
import com.android.volley.ParseError
|
|
import com.android.volley.Request
|
|
import com.android.volley.Response
|
|
import com.android.volley.toolbox.HttpHeaderParser
|
|
import com.google.gson.Gson
|
|
import com.google.gson.JsonSyntaxException
|
|
import java.io.UnsupportedEncodingException
|
|
import java.nio.charset.Charset
|
|
|
|
/**
|
|
* Make a GET request and return a parsed object from JSON.
|
|
*
|
|
* @param url URL of the request to make
|
|
* @param clazz Relevant class object, for Gson's reflection
|
|
* @param headers Map of request headers
|
|
*
|
|
* From here: https://developer.android.com/training/volley/request-custom
|
|
*/
|
|
class GsonGetRequest<T>(
|
|
url: String,
|
|
private val clazz: Class<T>,
|
|
private val headers: MutableMap<String, String>?,
|
|
private val listener: Response.Listener<T>,
|
|
errorListener: Response.ErrorListener
|
|
) : Request<T>(Method.GET, url, errorListener) {
|
|
private val gson = Gson()
|
|
|
|
override fun getHeaders(): MutableMap<String, String> = headers ?: super.getHeaders()
|
|
|
|
override fun deliverResponse(response: T) = listener.onResponse(response)
|
|
|
|
override fun parseNetworkResponse(response: NetworkResponse?): Response<T> {
|
|
return try {
|
|
val json = String(
|
|
response?.data ?: ByteArray(0),
|
|
Charset.forName(HttpHeaderParser.parseCharset(response?.headers)))
|
|
Response.success(
|
|
gson.fromJson(json, clazz),
|
|
HttpHeaderParser.parseCacheHeaders(response))
|
|
} catch (e: UnsupportedEncodingException) {
|
|
Response.error(ParseError(e))
|
|
} catch (e: JsonSyntaxException) {
|
|
Response.error(ParseError(e))
|
|
}
|
|
}
|
|
}
|