Как в связке Retrofit+Soap расположить header перед телом body?
Тело запроса который у меня выходит:
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<get_Content xmlns="http://tempuri.org/">
...
</get_Content>
</soap12:Body>
<soap12:Header>
<MyHeader xmlns="http://tempuri.org/">
....
</MyHeader>
</soap12:Header>
</soap12:Envelope>
Ответ пустой результат:
<soap:Body>
<get_ContentResponse xmlns="http://tempuri.org/" />
</soap:Body>
Тело запроса который работает в postman:
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Header>
<MyHeader xmlns="http://tempuri.org/">
....
</MyHeader>
</soap12:Header>
<soap12:Body>
<get_Content xmlns="http://tempuri.org/">
...
</get_Content>
</soap12:Body>
</soap12:Envelope>
Ответ с результатом:
<get_ContentResponse xmlns="http://tempuri.org/">
<get_ContentResult>....</get_ContentResult>
</get_ContentResponse>
Класс envelope, вроде позиция правильная:
class ContentRequestEnvelope {
@set:Element(name = "soap12:Header", required = false)
@get:Element(name = "soap12:Header", required = false)
lateinit var header: ContentRequestHeader
@set:Element(name = "soap12:Body", required = false)
@get:Element(name = "soap12:Body", required = false)
lateinit var body: ContentRequestBody
}
Образование envelope:
val envelope = ContentRequestEnvelope()
val header = ContentRequestHeader()
val dataHeader = ContentRequestDataHeader()
dataHeader.request = "..."
header.contentRequestHeader = dataHeader
envelope.header = header
val body = ContentRequestBody()
val dataBody = ContentRequestDataBody()
dataBody.arg = "..."
envelope.body = body
val call: Call<ContentResponseEnvelope> = serverApi.requestStateInfo(envelope)
call.enqueue(object : Callback<ContentResponseEnvelope> {
override fun onResponse(
call: Call<ContentResponseEnvelope>,
response: Response<ContentResponseEnvelope>
) {}
override fun onFailure(
call: Call<ContentResponseEnvelope>,
t: Throwable
) {}
})
}
Я предполагаю, что проблема в позиции тегов. Как это исправить?
Может проблема в другом...?
Ответы (1 шт):
Автор решения: Eugene Krivenja
→ Ссылка
Проблема описана тут с вариантом решения для SimpleXML framework
https://github.com/square/retrofit/issues/2269
Весь вопрос в правильном написании аннотации @Order, ваш вариант будет что-то типа такого:
@Order(elements = {"soap12:Envelope/soap12:Header", "soap12:Envelope/soap12:Body"})