如何从 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从Firestore中的数组字段中获取数据?