在Kotlin中通过改造操作复杂url?
我想用fuel将我的ArticleDataProvider转换为改装版,但我不知道如何操作URL 我有一个对象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
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:调用