0

Hi I am trying to make a soap request. I am using Retrofit and SimpleXmlFactory as the adapter. I have written the below data class for the soap request. But when making a request I am getting error like this:

org.simpleframework.xml.core.ConstructorException: Parameter 'soap:Body' does not have a match in class

Soap request:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://myserver.com/webservices/">
    <soap:Header/>
    <soap:Body>
        <web:GetAvailablePasses>
            <web:securityToken>*****</web:securityToken>
            <web:userName>*****</web:userName>
            <web:password>*****</web:password>
        </web:GetAvailablePasses>
    </soap:Body>
</soap:Envelope>

This is my data class:

@Root(name = "soap:Envelope")
data class GetAvailablePassesRequest(
    @Element(name = "soap:Body", required = false)
    val body: MyRequest
)

@Root(name = "soap:Body", strict = false)
data class MyRequest(
    @Element(name = "web:GetAvailablePasses")
    val getAvailablePasses: GetAvailablePasses
)

@Root(name = "web:GetAvailablePasses")
data class GetAvailablePasses(
    @Element(name = "web:securityToken")
    var securityToken: String,
    @Element(name = "web:userName")
    var userName: String,
    @Element(name = "web:password")
    var password: String
)

This is my ApiService interface:

@POST("FlashPassAPI.asmx")
    fun getAvailablePasses(@Body request: GetAvailablePassesRequest): Single<GetAvailablePassesResponse>

What am I doing wrong?

IMSoP
  • 89,526
  • 13
  • 117
  • 169
sagar suri
  • 4,351
  • 12
  • 59
  • 122

1 Answers1

0

Try using "Body" instead of "soap:Body" in your code, let me know if it works

@Root(name = "soap:Envelope")
data class GetAvailablePassesRequest(
    @Element(name = "Body")
    val body: MyRequest
)

@Element(name = "soap:Body")
data class MyRequest(
    @Element(name = "web:GetAvailablePasses")
    val getAvailablePasses: GetAvailablePasses
)

@Element(name = "web:GetAvailablePasses")
data class GetAvailablePasses(
    @Element(name = "web:securityToken")
    var securityToken: String,
    @Element(name = "web:userName")
    var userName: String,
    @Element(name = "web:password")
    var password: String
)

Just copy and paste the above code in your data class.

Sayan Mukherjee
  • 352
  • 2
  • 21