Retrofit2 с нулевыми ответами Kotlin - PullRequest
0 голосов
/ 24 сентября 2018

Попытка сделать вызов API для https://martialwebapi.azurewebsites.net/api/PostModel, который просто возвращает простой объект Json с некоторыми ненужными данными.Я получаю список с правильным количеством записей, но все, кроме поля ID, пусто.Почему все поля кроме идентификатора не заполнены.

Ответ

0 = {PostModel@5599} "PostModel(ID=1, title=null, dataType=0, content=null)"
1 = {PostModel@5600} "PostModel(ID=2, title=null, dataType=0, content=null)"
2 = {PostModel@5601} "PostModel(ID=3, title=null, dataType=0, content=null)"
3 = {PostModel@5602} "PostModel(ID=4, title=null, dataType=0, content=null)"

Вызов клиента

private fun apiCall() {
    val client = RetrofitClientKotlin.create()
    client.getPopularPosts()
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                var postResponse: List<PostModel> = it
                adapter.setPosts(postResponse)
            },{
                it.printStackTrace()
            })

}

Клиент

public class RetrofitClient {
    private static final String baseURL = "https://martialwebapi.azurewebsites.net";

    private static Retrofit getClient(){
        return new Retrofit.Builder()
                .baseUrl(baseURL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static ApiService getApiService(){
        return getClient().create(ApiService.class);
    }
}

Интерфейс API

interface MartialApiService {
    @GET("/api/PostModel")
    fun getPopularPosts(): Observable<List<PostModel>>
}

Модель

data class PostModel(val ID: Int, val title: String, val dataType: Int, val content: String)

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

вам нужно использовать simple-xml.

реализацию "com.squareup.retrofit2: converter-simplexml: $ retrofitVersion"

и изменить свою фабрику.

private static Retrofit getClient(){
        return new Retrofit.Builder()
                .baseUrl(baseURL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(
        SimpleXmlConverterFactory.createNonStrict(
            new Persister(new AnnotationStrategy() // important part!
          )
                .build();
    }

в вашей модели данных установите @root на false

@Root(strict = false)
data class PostModel(val ID: Int, val title: String, val dataType: Int, val content: String)

Должно работать.

0 голосов
/ 24 сентября 2018

Ваш XML использует заголовок, содержимое и т. Д., А вы используете строчные заголовок, содержимое и т. Д. С помощью Gson вы можете добавить аннотацию @SerializedName, когда ваши локальные переменные не соответствуют именам узлов XML:

data class PostModel(
    @SerializedName("ID") val id: Int,
    @SerializedName("Title") val title: String, 
    @SerializedName("DataType") val dataType: Int, 
    @SerializedName("Content") val content: String
)
0 голосов
/ 24 сентября 2018

Я не вижу здесь никакого вопроса, но возможно, ответ будет: retrofit2.Response, чтобы избежать исключения нулевого указателя

interface MartialApiService {
    @GET("/api/PostModel")
    fun getPopularPosts(): Observable<Response<List<PostModel>>>
}

И проверьте, является ли ответ успешным, а тело не равно нулю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...