在Kotlin中通过改造操作复杂url?

在Kotlin中通过改造操作复杂url?,kotlin,retrofit,fuel,Kotlin,Retrofit,Fuel,我想用fuel将我的ArticleDataProvider转换为改装版,但我不知道如何操作URL 我有一个对象URL来获取随机文章或搜索文章: object Urls { private const val BaseUrl = "https://en.wikipedia.org/w/api.php" fun getSearchUrl(term: String, skip: Int, take: Int): String { return BaseUrl + "?action=quer

我想用fuel将我的ArticleDataProvider转换为改装版,但我不知道如何操作URL

我有一个对象URL来获取随机文章或搜索文章:

object Urls {

private const val BaseUrl = "https://en.wikipedia.org/w/api.php"

fun getSearchUrl(term: String, skip: Int, take: Int): String {
    return BaseUrl + "?action=query" +
            "&formatversion=2" +
            "&generator=prefixsearch" +
            "&gpssearch=$term" +
            "&gpslimit=$take" +
            "&gpsoffset=$skip" +
            "&prop=pageimages|info" +
            "&piprop=thumbnail|url" +
            "&pithumbsize=200" +
            "&pilimit=$take" +
            "&wbptterms=description" +
            "&format=json" +
            "&inprop=url"
}

fun getRandomUrl(take: Int): String {
    return BaseUrl + "?action=query" +
            "&format=json" +
            "&formatversion=2" +
            "&generator=random" +
            "&grnnamespace=0" +
            "&prop=pageimages|info" +
            "&grnlimit=$take" +
            "&inprop=url" +
            "&pithumbsize=200"
}
}

我的文章提供者:

class ArticleDataProvider {

init {
    FuelManager.instance.baseHeaders = mapOf("User-Agent" to "Pluralsight Wikipedia")
}


fun search(term: String, skip: Int, take: Int, responseHandler: (result: WikiResult) -> Unit?) {
    Urls.getSearchUrl(term, skip, take).httpGet()
        .responseObject(WikipediaDataDeserializer()) { _, response, result ->

            try {

                //do something with result
                if (response.statusCode == STATUS_CODE) {
                    val (data, _) = result
                    responseHandler.invoke(data as WikiResult)

                }
            } catch (e: HttpException) {


            }
        }
}

fun getRandom(take: Int, responseHandler: (result: WikiResult) -> Unit?) {
    Urls.getRandomUrl(take).httpGet()
        .responseObject(WikipediaDataDeserializer()) { _, response, result ->
            try {
                //do something with result
                if (response.statusCode == STATUS_CODE) {
                    val (data, _) = result
                    responseHandler.invoke(data as WikiResult)
                }
            } catch (e: HttpException) {
                //    Log.e("error", e.message)
            }
        }
}


class WikipediaDataDeserializer : ResponseDeserializable<WikiResult> {
    override fun deserialize(reader: Reader) = Gson().fromJson(reader, WikiResult::class.java)!!
}
类ArticleDataProvider{
初始化{
FuelManager.instance.baseHeaders=mapOf(“用户代理”到“Pluralsight维基百科”)
}
有趣的搜索(术语:String,skip:Int,take:Int,responseHandler:(结果:WikiResult)->Unit?){
getSearchUrl(term,skip,take).httpGet()
.responseObject(WikipediaDataDeserializer()){{响应,结果->
试一试{
//做一些有结果的事情
if(response.statusCode==状态\代码){
val(数据)=结果
invoke(数据作为WikiResult)
}
}catch(e:HttpException){
}
}
}
fun getRandom(取:Int,responseHandler:(结果:WikiResult)->单位?){
getRandomUrl(take.httpGet())
.responseObject(WikipediaDataDeserializer()){{响应,结果->
试一试{
//做一些有结果的事情
if(response.statusCode==状态\代码){
val(数据)=结果
invoke(数据作为WikiResult)
}
}catch(e:HttpException){
//Log.e(“错误”,e.message)
}
}
}
类WikipediaDataDeserializer:ResponseDeserializable{
重写fun反序列化(reader:reader)=Gson().fromJson(reader,WikiResult::class.java)!!
}
}

这是我为getRandom请求改装的界面

private const val BaseUrl = "https://en.wikipedia.org/w/"

interface ArticleProvider {

  @GET("api.php?action=query&format=json&generator=random&prop=pageimages|info&grnlimit={take}&inprop=url&pithumbsize=200")
  fun getRandom (@Query("grnlimit") take: Int) : Call<WikiResult>

companion object{
    fun create() : ArticleProvider {
        val retrofit = Retrofit.Builder()
            .baseUrl(BaseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        return retrofit.create(ArticleProvider::class.java)
    }
}
private const val BaseUrl=”https://en.wikipedia.org/w/"
接口提供程序{
@GET(“api.php?action=query&format=json&generator=random&prop=pageimages | info&grnlimit={take}&inprop=url&pithumbsize=200”)
fun getRandom(@Query(“grnlimit”)take:Int):调用
伴星{
乐趣创建():ArticleProvider{
val reformation=reformation.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
返回reformation.create(ArticleProvider::class.java)
}
}
}


我应该将URL中的所有值更改为GET中的查询,或者我应该做什么?

您可以将不需要更改的查询参数直接添加到URL中。然后,如果您有一些需要更改的参数,请将这些参数放入函数参数中,就像您放入函数参数一样。您还可以将每个查询参数定义为具有默认值的函数参数,以便更好地记录请求。您可以将函数参数声明为可为null的类型,以便在设置为null时它不会转到URL

下面是代码中的一个小示例:

@GET("api.php")
fun getRandom(
        @Query("action") action: String? = "query",
        @Query("format") format: String? = "json",
        @Query("generator") generator: String? = "random",
        @Query("prop") prop: String? = "pageimages|info",
        @Query("grnlimit") grnlimit: Int? = 0, // This can be left without default value so it must be given always
        @Query("inprop") inprop: String? = "url",
        @Query("pithumbsize") pithumbsize: Int? = 200) : Call<WikiResult>
下面是一个示例,如果您只需要更改一些参数,并在URL中保留常量参数:

@GET("api.php?action=query&format=json&generator=random&inprop=url&pithumbsize=200")
fun getRandom(
        // This can be left without default value so it must be given always
        @Query("grnlimit") grnlimit: Int? = 0) : Call<WikiResult>
@GET(“api.php?action=query&format=json&generator=random&inprop=url&pithumbsize=200”)
趣味随机(
//这可以不带默认值,因此必须始终给定它
@查询(“grnlimit”)grnlimit:Int?=0:调用

您可以将不需要更改的查询参数直接放入URL。然后,如果您有一些需要更改的参数,请将这些参数放入函数参数中,就像您放入函数参数一样。您还可以将每个查询参数定义为具有默认值的函数参数,以便更好地记录请求。您可以将函数参数声明为可为null的类型,以便在设置为null时它不会转到URL

下面是代码中的一个小示例:

@GET("api.php")
fun getRandom(
        @Query("action") action: String? = "query",
        @Query("format") format: String? = "json",
        @Query("generator") generator: String? = "random",
        @Query("prop") prop: String? = "pageimages|info",
        @Query("grnlimit") grnlimit: Int? = 0, // This can be left without default value so it must be given always
        @Query("inprop") inprop: String? = "url",
        @Query("pithumbsize") pithumbsize: Int? = 200) : Call<WikiResult>
下面是一个示例,如果您只需要更改一些参数,并在URL中保留常量参数:

@GET("api.php?action=query&format=json&generator=random&inprop=url&pithumbsize=200")
fun getRandom(
        // This can be left without default value so it must be given always
        @Query("grnlimit") grnlimit: Int? = 0) : Call<WikiResult>
@GET(“api.php?action=query&format=json&generator=random&inprop=url&pithumbsize=200”)
趣味随机(
//这可以不带默认值,因此必须始终给定它
@查询(“grnlimit”)grnlimit:Int?=0:调用