Тело ответа на переоснащение дает ноль - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь использовать API, который возвращает JSON, и я использую Retrofit, чтобы получить ответ и проанализировать его.

API повторяет JSON, как показано ниже:

{
 "total": 1244881,
 "totalHits": 500,
 "hits": [
  {
   "id": 5205518,
   "pageURL": "https://pixabay.com/photos/landscape-sea-sky-clouds-sunset-5205518/",
   "type": "photo",
   "tags": "landscape, sea, sky",
   "previewURL": "https://cdn.pixabay.com/photo/2020/05/22/14/04/landscape-5205518_150.jpg",
   "webformatWidth": 640,
   "webformatHeight": 427,
    ...
    ...
  },
    ...
    ...
  ]
}

И для GSON, чтобы преобразовать этот json в объект, я создал два класса: первый: RquestModel.java

public class RequestModel {

    @SerializedName("total")
    private long total;

    @SerializedName("totalHits")
    private long totalHits;

    @SerializedName("hits")
    private List<Image> hits;

    //Getters and setters down here...

}

и второй класс для массива в json is:

public class Image {

    @SerializedName("id")
    private long id;

    @SerializedName("pageURL")
    private String pageURL;

    @SerializedName("type")
    private String type;

    @SerializedName("tags")
    private String tags;

    @SerializedName("previewURL")
    private String previewURL;

    @SerializedName("previewWidth")
    private long previewWidth;

    @SerializedName("previewHeight")
    private long previewHeight;

    @SerializedName("webformatURL")
    private String webformatURL;

    @SerializedName("webformatWidth")
    private long webformatWidth;

    @SerializedName("webformatHeight")
    private long webformatHeight;

    @SerializedName("largeImageURL")
    private String largeImageURL;

    @SerializedName("imageWidth")
    private long imageWidth;

    @SerializedName("imageHeight")
    private long imageHeight;

    @SerializedName("imageSize")
    private long imageSize;

    @SerializedName("views")
    private long views;

    @SerializedName("downloads")
    private long downloads;

    @SerializedName("favorites")
    private long favorites;

    @SerializedName("likes")
    private long likes;

    @SerializedName("comments")
    private long comments;

    @SerializedName("user_id")
    private long userId;

    @SerializedName("user")
    private String user;

    @SerializedName("userImageURL")
    private String userImageURL;


    //Getters and Setters down here ..... 



}

И для интерфейса, который использует конвертер GSON, это выглядит следующим образом:

public interface ImageAPIService {

    @GET(".")
    public Call<RequestModel> getRequest();

}

и Когда я пытаюсь использовать ответ от Callback, например:

Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl(API_URL)
                            .addConverterFactory(GsonConverterFactory.create())
                            .build();

ImageAPIService api = retrofit.create(ImageAPIService.class);

Call<RequestModel> request = api.getRequest();

request.enqueue(new Callback<RequestModel>() {
    @Override
    public void onResponse(Call<RequestModel> call, Response<RequestModel> response) {
        mViewModel.setTxt(response.body().getTotal() + "");
    }

    @Override
    public void onFailure(Call<RequestModel> call, Throwable t) {

    }
});

, что дает исключение типа: java.lang.NullPointerException:

java.lang.NullPointerException: Attempt to invoke virtual method 'long com.mapps.pixabayclient.models.RequestModel.getTotal()' on a null object reference

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

И заранее спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Итак, проблема, как вы уже поняли, в том, что при вашей настройке ключ удаляется из запроса. Это ответ, когда я делаю запрос с вашей настройкой.

Response {protocol = http / 1.1, code = 400, message = Bad Request, url = https://pixabay.com/api/ }

Но так быть не должно. Согласно это от Джейка Уортона, если мы используем @GET("."), тогда весь base_url становится URL-адресом запроса. По некоторым причинам это не относится к вам. [Возможно, если мы зарегистрируем URL-адрес запроса с помощью некоторого перехватчика, тогда мы сможем лучше понять, что происходит (будь то проблема модернизации или проблема с серверной частью)].

В любом случае, одно решение - передать ключ api для каждого запросите, как показано ниже:

@GET(".")
public Call<RequestModel> getRequest(@Query("key") String key);

и вызовите функцию следующим образом:

api.getRequest("my_api_key")

Другое решение - жестко закодировать ключ api в @GET("api/?key=xxxxx"), как вы уже сделали.

Лучшее решение - использовать перехватчик okhttp для перехвата запросов и добавить параметр запроса ключа api в URL-адрес. Благодаря этому решению вам не придется передавать ключ api для каждого вызова функции.

0 голосов
/ 26 мая 2020

Проблема была в аннотации @GET, поскольку я переместил ключ api /? Внутри круглых скобок аннотации GET -> @GET("api/?key=xxxxxxx"), но теперь проблема в том, что я должен передавать ключ в каждом GET или любом другом тип запроса.

есть ли обходной путь для систематической передачи ключа в каждом запросе?

...