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转换器替代:
- 添加依赖到build.gradle(app):
implementation 'com.squareup.retrofit2:converter-jackson:2.9.0' implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.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() - 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
相关产品推荐
相关产品推荐

