You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit调用XML接口遇URL异常及请求注解疑问求助

解决Retrofit调用XML API时的URL异常与序列化问题

1. 修复URL路径异常(当前触发的核心错误)

你遇到的java.lang.IllegalArgumentException: Expected URL scheme 'http' or 'https' but no scheme was found for /异常,根源是API接口的@POST路径为空,加上Retrofit的baseUrl配置不规范导致URL拼接错误:

  • 确保Retrofit实例的baseUrl是完整的HTTP/HTTPS地址,且末尾必须带斜杠,示例:
    val retrofit = Retrofit.Builder()
        .baseUrl("https://your-api-server.com/") // 末尾带斜杠
        // 其他配置
        .build()
    
  • 给每个@POST注解指定具体的接口路径,不能留空字符串,示例:
    interface PayAtTableApi {
        @POST("login") // 替换为空的具体接口路径
        suspend fun login(@Body loginRequest: LoginRequestDTO? = null): Response<LoginResponseDTO>
    
        @POST("checkout-info")
        suspend fun checkOutInfo(@Body checkOutInfoRequest: GetCheckInfoRequestDTO? = null): Response<GetCheckInfoResponseDTO>
    
        // 其他接口同理补充具体路径
    }
    

2. 确认XML转换器的配置与DTO注解

你使用的SimpleXmlConverter虽已废弃,但要正常工作必须给DTO类添加对应的XML序列化注解:

  • 给请求/响应DTO添加SimpleXML注解,示例:
    @Root(name = "LoginRequest", strict = false) // strict=false可忽略多余字段
    data class LoginRequestDTO(
        @Element(name = "Username")
        val username: String,
        @Element(name = "Password")
        val password: String
    )
    
    @Root(name = "LoginResponse", strict = false)
    data class LoginResponseDTO(
        @Element(name = "Token")
        val token: String,
        @Element(name = "Success")
        val isSuccess: Boolean
    )
    
  • 构建Retrofit时必须添加SimpleXmlConverterFactory:
    val retrofit = Retrofit.Builder()
        .baseUrl("https://your-api-server.com/")
        .addConverterFactory(SimpleXmlConverterFactory.create())
        .build()
    

3. @Body注解的正确性

你怀疑的@Body注解是正确的,它适合将DTO对象序列化为XML请求体提交给API,不需要替换为其他注解(比如@Field用于表单提交,不适合XML格式)。问题不在@Body,而是前面的URL和转换器配置。

可选:替换为非废弃的XML转换器

由于SimpleXmlConverter已废弃,推荐使用Jackson的XML转换器替代:

  1. 添加依赖到build.gradle(app):
    implementation 'com.squareup.retrofit2:converter-jackson:2.9.0'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'
    
  2. 构建Retrofit时使用JacksonXmlConverterFactory:
    val xmlMapper = XmlMapper()
    // 可选:忽略未知字段,避免解析报错
    xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    val retrofit = Retrofit.Builder()
        .baseUrl("https://your-api-server.com/")
        .addConverterFactory(JacksonXmlConverterFactory.create(xmlMapper))
        .build()
    
  3. DTO类使用Jackson的XML注解:
    @JacksonXmlRootElement(localName = "LoginRequest")
    data class LoginRequestDTO(
        @JacksonXmlProperty(localName = "Username")
        val username: String,
        @JacksonXmlProperty(localName = "Password")
        val password: String
    )
    

内容的提问来源于stack exchange,提问作者Manuel Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:32:38