Я пытаюсь создать службу в приложении для 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, и яс помощью Котлин, но не повезло.
Любая помощь приветствуется.Заранее спасибо.