如何在Kotlin中正确使用OKHttp FormBody.Builder()调用DVLA车辆查询API?
解决DVLA车辆查询API的Kotlin/OKHttp请求错误问题
问题背景
已通过Python实现DVLA车辆查询API的调用,但改用Kotlin结合OKHttp适配Android应用时遇到问题:
- 使用
FormBody.Builder()构造请求体传递车牌信息,API返回400错误:{"errors":[{"status":"400","code":"ENQ108","detail":"Invalid format for field - vehicle registration number","title":"Bad Request"}]}
- 打印
Request对象仅能看到URL和请求头,无法查看请求体,难以定位问题。
错误原因
DVLA车辆查询API要求请求体为JSON格式,而你的代码使用了FormBody(表单编码格式),导致API无法正确解析registrationNumber参数,触发格式错误。
修正后的代码
import okhttp3.* import java.io.IOException private val client = OkHttpClient() private val url_dvla = "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" private val auth_dvla = "MY_API_KEY" // 替换为真实API密钥 fun main(){ run(url_dvla) } fun run(url: String){ // 构造JSON格式请求体 val jsonMediaType = MediaType.get("application/json; charset=utf-8") val requestBody = RequestBody.create( jsonMediaType, """{"registrationNumber": "AP08EKT"}""" ) val request = Request.Builder() .url(url) .post(requestBody) .addHeader("x-api-key", auth_dvla) .addHeader("Content-Type", "application/json") // 必须指定JSON类型的Content-Type .build() // 调试:打印请求体内容 request.body?.let { body -> val buffer = okio.Buffer() body.writeTo(buffer) println("请求体内容: ${buffer.readUtf8()}") } println(request) client.newCall(request).enqueue(object : Callback{ override fun onFailure(call: Call, e: IOException) { e.printStackTrace() } override fun onResponse(call: Call, response: Response) { response.body?.use { body -> println(body.string()) } } }) }
关键修改说明
- 请求体格式替换:将
FormBody改为JSON格式的RequestBody,符合API的参数要求。 - 添加Content-Type头:明确指定请求头
Content-Type: application/json,告知API请求体的格式。 - 调试请求体:通过
okio.Buffer读取请求体内容并打印,方便后续排查格式类问题。 - 资源优化:使用
response.body?.use{}自动关闭响应体,避免资源泄漏。
内容的提问来源于stack exchange,提问作者arnzzz
相关产品推荐
相关产品推荐

