如何从 Kotlin 中的服务器正确获取 XML

Posted

技术标签:

【中文标题】如何从 Kotlin 中的服务器正确获取 XML【英文标题】:how to fetch correctly XML from a server in Kotlin 【发布时间】:2020-06-14 15:21:48 【问题描述】:

ios 开发中,当我获取显示 XML 的 URL 时,我可以解析整个 XML 文件并在我的代码中使用它的数据,但在 Kotlin 中我尝试获取相同的 URL,它只返回第一个 XML 标记,例如如果其余部分隐藏在主标签中。

    val urlString = URL_TO_FETCH_IN_HTTPS (String)
    val client = OkHttpClient()
    val request = Request.Builder().url(urlString).build()

    client.newCall(request).enqueue(object: Callback 
        override fun onResponse(call: Call, response: Response) 
            if (response.isSuccessful) 
                val body = response.body?.string()

                println("RESPONSE " + body)
            
        

        override fun onFailure(call: Call, e: IOException) 
            println("Failure")
        
    )

这个调用的响应只是

RESPONSE < ?xml version="1.0" encoding="UTF-8"?>< rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

虽然url不错,浏览器返回的xml也不错。

那么我在代码中做错了什么?如何在此 url 获取整个 XML?

我使用 OkHttp 库从 URL 获取数据

【问题讨论】:

整个 XML 是什么意思?你期待什么回应? 我希望通过此链接lexilife.com/rss 检索 xml 的内容,以及我可以解析的所有数据。它是 Prestashop API 返回的 xml 文件 你确定你正确安装了 prestashop 吗?你确定使用正确的 apikey 吗?您也可以尝试像这样添加 ?output_format=JSON :UCCLLQ9N2ARSHWCXLT74KUKSSK34BFKX@example.com/api/… 以获得可能比 xml 更有用的 json 格式。我在我这边获取数据没有问题。您是否也尝试按照我的建议添加拦截器?调试非常简单 好吧,我的错,新手错误^^问题是我的日志的响应是“RESPONSE ”因为当我在logcat中搜索日志时,我在搜索栏中输入了“RESPONSE”,所以它只给了我第一行......在 iOS 中,它会在日志中的“RESPONSE”字旁边写下整个对象 OK,祝你项目好运,无论如何尝试为 okhttp 添加拦截器,我给你的只是几行,非常方便。 【参考方案1】:

首先要调试 Okhttp,我建议添加一个拦截器:

val logging = HttpLoggingInterceptor()
            logging.level = HttpLoggingInterceptor.Level.HEADERS
            logging.level = HttpLoggingInterceptor.Level.BODY

然后像这样构建您的客户端,首先添加拦截器并处理超时:

 client = OkHttpClient.Builder()
                .addInterceptor(logging)
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .build()

那么你可以:client.newCall(request).enqueue(object : Callback ...

通过这样做,您可以轻松调试 Okhttp,您将在日志中看到您使用参数 send + 发出的请求,然后服务器使用代码和正文进行响应。所有呼叫都以蓝色书写,以提高可见性。

如果您仍有问题,请不要犹豫。

你应该看看retrofit2,它是一个处理所有apicall的简单库。

【讨论】:

以上是关于如何从 Kotlin 中的服务器正确获取 XML的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit 2.0 (Kotlin) 正确解析嵌套的 JSON 对象?

如何从 Kotlin 中的 Hashmap 获取值的关键?

如何使用Kotlin从Firestore中的数组字段中获取数据?

如何使用 PHP 从 Web 服务获取 XML 数据?

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

如何在Kotlin中正确处理大于127的字节值?