[英]Kotlin - vararg -> change query param values
在我的android應用中,我使用Retrofit 2
def RETROFIT_VERSION = '2.6.0'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
api 'com.squareup.okhttp3:logging-interceptor:3.8.0'
api "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
api "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
這是我的服務:
public enum OperationType {
PAYMENT, PAYOUT, TRANSFER
}
import retrofit2.Call
import retrofit2.http.*
import java.util.*
@GET("/operations")
fun getOperationsList(
@Query("types") typeList: List<@JvmSuppressWildcards OperationType>,
@Query("status") statusList: List<@JvmSuppressWildcards OperationStatus>,
@Query("from") from: Date, @Query("to") to: Date
): Call<List<Operation>>
在這里使用:
val call = restClient.getOperationsList(
typesList,
statusList = operationStatusList,
from = from,
to = to
)
結果如下:
D/OkHttp (24112): --> GET http://my_ip:8081/operations?types=payment&types=payout&status=executed&from=2019-08-07T00%3A00%3A00&to=2019-08-07T23%3A59%3A59 http/1.1
如您所見,參數“ type
”通過2次。 尼斯。
現在,我像這樣使用vararg參數:
@GET("/operations")
fun getOperationsList(
vararg @Query("types") typeList: List<@JvmSuppressWildcards OperationType>,
@Query("status") statusList: List<@JvmSuppressWildcards OperationStatus>,
@Query("from") from: Date, @Query("to") to: Date
): Call<List<Operation>>
現在結果是:
D/OkHttp (25017): --> GET http://my_ip:8081/operations?types=%5Bpayment%2C%20payout%5D&status=executed&from=2019-08-07T00%3A00%3A00&to=2019-08-07T23%3A59%3A59 http/1.1
如您所見,參數“ type ”現在以不同的方式傳遞。 如果我解碼URL我得到
http://my_ip:8081/operations?types=[payment, payout]&status=executed&from=2019-08-07T00:00:00&to=2019-08-07T23:59:59 http/1.1
我只需要這樣傳遞參數“ type ”: type = value&type = value2 ...像這樣:
D/OkHttp (24112): --> GET http://my_ip:8081/operations?types=payment&types=payout&status=executed&from=2019-08-07T00%3A00%3A00&to=2019-08-07T23%3A59%3A59 http/1.1
我該如何解決?
使用vararg
,必須將變量的類型設置為單個對象的類型,而不是整個集合的類型。 將typeList
類型更改為OperationTypes
:
@GET("/operations")
fun getOperationsList(
@Query("types") vararg types: OperationTypes,
@Query("status") statusList: List<@JvmSuppressWildcards OperationStatus>,
@Query("from") from: Date, @Query("to") to: Date
): Call<List<Operation>>
讓我解釋一下vararg
如何處理這些示例:
1)
fun getOperationsList(vararg types: OperationTypes)
在這種情況下, getOperationsList
方法接受類型為OperationTypes
多個參數。 在其主體內部, types
變量實際上是Array<OperationTypes>
的類型。
您可以像這樣調用getOperationsList
(我假設OperationTypes
是一個枚舉類):
getOperationsList(OperationTypes.PAYMENT, OperationTypes.PAYOUT)
// or using the spread operator
val types = listOf(OperationTypes.PAYMENT, OperationTypes.PAYOUT)
getOperationsList(*types.toTypedArray())
在該方法內部, types
的值等於:
types = arrayOf(OperationTypes.PAYMENT, OperationTypes.PAYOUT)
2)
fun getOperationsList(vararg types: List<OperationTypes>)
在這種情況下, getOperationsList
期望其參數為OperationTypes
對象的多個列表 。 在其內部, types
變量是Array<List<OperationsTypes>>
的類型。
該函數可以稱為:
getOperationsList(listOf(OperationTypes.PAYMENT, OperationTypes.PAYOUT), listOf(OperationTypes.OTHER_TYPE))
並且里面的types
的值等於:
types = arrayOf(listOf(OperationTypes.PAYMENT, OperationTypes.PAYOUT), listOf(OperationTypes.OTHER_TYPE))
這就是為什么您當前的實現無法按需工作的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.