Retrofit2 + SimpleXML + SOAP запрос в Котлине - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать службу в приложении для Android, которая использует SOAP API.Отправленные значения и возвращаемые значения являются XML.Ранее я использовал FormUrlEncoded + JSON в другом API и работал, но с XML я борюсь, так как кажется, что API не вызывается (HttpLoggingInterceptor не отображается, а служба Mockup не показывает никаких петиций).

Если я перехожу на FormUrlEncoded моего сервиса, я вижу, что запрос выполнен (я проверил его с помощью HttpLoggingInterceptor, но если я удаляю FormUrlEncoded, кажется, что сервис не вызывается никогда.

Мой NetModule, где создаетсяretrofir, parser и т.д .:

@Module
class NetModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        val client =
            OkHttpClient.Builder()
                .addInterceptor(HttpLoggingInterceptor().apply {
                    level = HttpLoggingInterceptor.Level.BODY
                })
                .build()

        val strategy = AnnotationStrategy()
        val serializer = Persister(strategy)

        return Retrofit.Builder()
            .baseUrl(BuildConfig.API_URL)
            .client(client)
            .addConverterFactory(SimpleXmlConverterFactory.create(serializer))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()

    }

    @Provides
    @Singleton
    fun provideFilesService(retrofit: Retrofit): FilesService =
        retrofit.create(FilesService::class.java)
}

My FilesService.kt, где определен интерфейс:

import com.liderasoluciones.enviotest.data.model.FileSendResponse
import com.liderasoluciones.enviotest.data.model.FileSendEnvelope
import io.reactivex.Flowable
import retrofit2.http.*

interface FilesService {
    @Headers(
        "Content-Type: application/soap+xml",
        "Accept-Charset: utf-8"
    )
    @POST("mockWSSMTSoap")
    fun sendFile(@Body body: FileSendEnvelope): Flowable<FileSendResponse>

}

Моя модель для тела, запроса и данных - FileSendEnvelope.kt иis:

import org.simpleframework.xml.Element
import org.simpleframework.xml.Root
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.NamespaceList;

@Root(name = "GetInfoByState", strict = false)
@Namespace(reference = "http://www.webservicetest.net")

class FileSendData {

    @Element(name = "FileName", required = false)
    var name: String? = null

}

@Root(name = "soap12:Body", strict = false)
class FileSendBody {

    @Element(name = "GetInfoByFile", required = false)
    var fileSendData: FileSendData? = null

}

@Root(name = "soap12:Envelope")
@NamespaceList(
    Namespace(prefix = "xsi", reference = "http://www.w3.org/2001/XMLSchema-instance"),
    Namespace(prefix = "xsd", reference = "http://www.w3.org/2001/XMLSchema"),
    Namespace(prefix = "soap12", reference = "http://www.w3.org/2003/05/soap-envelope")
)
class FileSendEnvelope {

    @Element(name = "soap12:Body", required = false)
    var body: FileSendBody? = null
}

Из класса RemoteDataSource я вызываю api:

class RemoteFilesDataSource(private val filesService: FilesService,
                            private val genericResponseEntityMapper: GenericResponseEntityMapper):
    FilesDataSource {

    override fun sendFile(userToken: String): Flowable<GenericResponseEntity> {
        var petitionEnvelope = FileSendEnvelope()
        var petitionBody = FileSendBody()
        var petitionData = FileSendData()
        petitionData.name = "test.png"

        petitionBody.fileSendData = petitionData
        petitionEnvelope.body =

        return filesService.sendFile(petitionEnvelope)
            .map { it.result }
            .map { genericResponseEntityMapper.transform(it) }
    }


}

В данный момент я не особо заботлюсь об отправленном XML или не разбираю ответ, я просто "хочу проверить", что API вызывается.

Я пытался следить за этой информацией: https://github.com/asanchezyu/RetrofitSoapSample http://geekcalledk.blogspot.com/2014/08/use-simple-xml-with-retrofit-for-making.html

Даже примеры Java, и яс помощью Котлин, но не повезло.

Любая помощь приветствуется.Заранее спасибо.

...