【问题标题】:how to fetch correctly XML from a server in Kotlin如何从 Kotlin 中的服务器正确获取 XML
【发布时间】: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 添加拦截器,我给你的只是几行,非常方便。

标签: android xml parsing kotlin 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的简单库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2016-04-14
    • 2015-03-03
    • 2020-01-24
    相关资源
    最近更新 更多