やりたいこと
リクエストが JSON Object で、レスポンスが JSON Array である API エンドポイントに、Volley でリクエストを投げたい
Volley の Json リクエスト
Volley には、JSON リクエストのメソッドとして以下の 2 つがある
メソッド | 説明 |
---|---|
JsonObjectRequest | JSON Object を渡して、JSON Object 形式のレスポンスを受け取る |
JsonArrayRequest | JSON Array を渡して、JSON Array 形式のレスポンスを受け取る |
このように、リクエストの形式とレスポンスの形式が一致しているメソッドしかない
仮に、上記のやりたいことを、これらのメソッドを使ってみると、
-
JsonObjectRequest
- リクエストを送ることはでき、レスポンスも返ってくるが、レスポンスが指定の形式じゃなので、Error Response 側の処理が実行される
-
JsonArrayRequest
- リクエストの形式が不正なので、そもそもリクエストできない
実現方法
調べた限りでは、カスタムリクエストクラスを作るしかなさそう
open class CustomJsonRequest(
method: Int,
url: String,
requestObject: JSONObject,
responseListener: Response.Listener<JSONArray>,
errorListener: Response.ErrorListener
): JsonRequest<JSONArray>(method, url, requestObject.toString(), responseListener, errorListener){
override fun deliverResponse(response: JSONArray) {
super.deliverResponse(response)
}
override fun parseNetworkResponse(response: NetworkResponse): Response<JSONArray> {
return try {
val jsonString = String(response.data, Charset.forName(HttpHeaderParser.parseCharset(response.headers)))
Response.success(JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response))
} catch (e: JSONException) {
Response.error(ParseError(e))
} catch (e: UnsupportedEncodingException) {
Response.error(ParseError(e))
}
}
}
あとは CustomJsonRequest
を使って、JsonObjectRequest
や JsonArrayRequest
を使う時と同じように書いてやれば実現できる
終わりに
JSON Object を渡し JSON Array をレスポンスするには、Volley の標準のメソッドは実現できず、自分でカスタムクラスを実装する必要があり思ったより大変でした