

同じWebAPIをリクエストパラメータを変えながら複数回呼び出ししています。RxJavaのMergeを使っています。  
WebAPIでは商品名を指定すると価格が返ってきますが、リクエストで指定した商品名はレスポンスに含まれません。  
レスポンス取得時にリクエスト内容を知るためにどのような方法がありますか？  
（残念ながらWebAPIの仕様は変えられないです）

### 環境

Kotlin, Retrofit2, RxJava2

### WebAPI仕様

商品名を指定すると、その商品の価格をJSONで返す  
request: /price/りんご  
response: {price:180}

### コード

[code]

    val apiArray = arrayOf(
        apiClient.getPrice("りんご"),
        apiClient.getPrice("もも"),
        apiClient.getPrice("ぶどう")
    )
    
    Observable.merge(*apiArray)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doAfterTerminate {
            println("全部終わった")
        }
        .subscribe({ price ->
            // ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
            // ※※※※ここでリクエストの商品名を知りたい※※※※
            // ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
            println("${xxx}の価格は${price.price}円です")
        },{
            println("エラー")
        })
    
[/code]

* * *
[code]

    interface ApiClient {
        @Headers("accept: application/json")
        @GET("/price/{name}")
        fun getPrice(@Path("name") name: String): Observable<Price>
    }
    
[/code]

* * *
[code]

    data class Price(val price: Int)
    
[/code]


CC BY-SA 4.0
2018-08-15T18:10:59.307
47546
2020-05-22T08:03:00.277
2018-08-15T18:23:07.767
29741
29741
question
android kotlin retrofit
WebAPIのレスポンス取得時にリクエスト内容を知りたい


WebAPIの仕様は変えられないのですから、別のAPIを用意して中継するのがよいと思います。

中継APIの概要  
・[呼び出し方] WebAPIと同じで、商品名を指定する。  
・[動作]  
中継APIは呼び出されると、指定された商品名でWebAPIを呼び出して、価格を得る。  
そして、商品名と価格をまとめてjson形式で返す。

というような感じ。


CC BY-SA 4.0
2018-08-16T06:01:19.320
47557
2018-08-16T06:01:19.320
217
47546
answer


`"りんご"` などのパラメータを結果と一緒に利用したいということですね。

でしたら、 `Observable.merge` だとイベントが順序不同になってしまい扱いづらいので、商品名の配列をもとに `flatMap`
で結果を結合するようにしてはどうでしょうか。（動作に変わりはありません）

[code]

    val names = arrayOf("りんご", "もも", "ぶどう")
    
    Observable
        .fromArray(names)
        .flatMap { name -> 
            // mapでnameと結果のPairにして流す
            apiClient.getPrice(name).map { name to it } 
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doAfterTerminate {
            println("全部終わった")
        }
        .subscribe({ (name, price) ->
            println("${name}の価格は${price.price}円です")
        }, {
            println("エラー")
        })
    
[/code]

### 追記

パラメータと結果のPairを流すストリームにしてから `merge` するのでも同じ動作になりますので、そちらも載せておきます。

[code]

    val names = arrayOf("りんご", "もも", "ぶどう")
    
    Observable
        .merge(names.map { name -> 
            // mapでnameと結果のPairにして流す
            apiClient.getPrice(name).map { name to it }
        })
        ...
    
[/code]


CC BY-SA 4.0
2018-08-18T11:46:54.290
47606
2018-08-19T09:19:33.230
2018-08-19T09:19:33.230
915
915
47546
answer