Какую структуру проекта для модификации Android-запроса GET мне нужно создать?

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


запрос сервера:

URL https: // мой_сервер / v1 / сообщение / список

Метод ПОЛУЧАТЬ

Заголовок HTTP - Авторизация: носитель $ access_token

Параметры URL тип 0 - для полученных сообщений 1 - для отправленных сообщений

Success Response
HTTP 200
{
    "count": int, # number of messages 
    "messages": [ # array of messages
        {
            "id": int, # message id
            "subject": str, # message subject
            "can_delete": int, # can it be deleted (1) or not (0)
            "new": int # message already read (0) or not (1)
            "date": str, # date of message in 'd.m.y'. If message was sent today format will be 'H:M'
            "receiver_name": str, # name of receiver if type=1
            "sender_name": str, # name of sender if type=0
        }, ...
    ],
    "next_url": URL,  # url for get next messages, if no more messages value is null
    "previous_url": URL # url for get previous messages, if no more messages value is null
}


Sample Call
curl -i -X GET -H "Content-Type:application/json" -H "Authorization:Bearer $ACCESS_TOKEN" https://server/v1/message/list?type=TYPE

код интерфейса

  @Headers({
            "Content-type: application/json",
            "Authorization: Bearer $ACCESS_TOKEN"})
    @GET("/v1/message/list?type=TYPE")
    Call<List<NewMessAnswer>> getInMess(@Query("id") Integer id,
                                        @Query("subject") String subject,
                                        @Query("can_delete") Integer can_delete,
                                        @Query("new") Integer new_m,
                                        @Query("date") String date,
                                        @Query("receiver_name") String receiver_name,
                                        @Query("sender_name") String sender_name,
                                        @Query("next_url") URL next_url,
                                        @Query("previous_url") URL previous_url);

классы запроса

public class Message {
    @SerializedName("id")
    int id;
    @SerializedName("subject")
    String subject;
    @SerializedName("can_delete")
    int isCanDelete;
    @SerializedName("new")
    int isNew;
    @SerializedName("date")
    String date;
    @SerializedName("receiver_name")
    String receiverName;
    @SerializedName("sender_name")
    String senderName;
}

Сообщение Ответ

import com.google.gson.annotations.SerializedName;
import java.net.URL;
import java.util.List;


public class MessageAnswer {
    @SerializedName("count")
    int count;
    @SerializedName("messages")
    List<Message> messages;
    @SerializedName("next_url")
    URL nextUrl;
    @SerializedName("previous_url")
    URL previousUrl;
}

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

поместите свой класс сообщения в Call <List <ClassName>>. это будет отражать ответ в этом типе, который вы можете просто использовать в адаптере listView / RecyclerView

Devil10 25.07.2018 08:38

спасибо, но я не могу понять, как после этого я могу инициализировать следующий интерфейс в классе mainactivity, потому что, когда я затем пишу Call <List <MessageAnswer>> listCall = mAPIService.getInMess (a, b, c); Мне нужно инициализировать все переменные, которые потребуют всех полей в моем интерфейсе. И я должен дать им некоторую ценность. Это правда?

Andrew 25.07.2018 08:47

эти переменные - параметры, необходимые для вызова вашего API. Вставьте сюда URL-адрес и ответ в формате json, чтобы лучше понять вашу проблему.

Devil10 25.07.2018 08:49

Я не могу дать вам URL-адрес и ответ в формате json, потому что сейчас я не могу выполнить ни один запрос GET со следующим кодом.

Andrew 25.07.2018 08:52

эти поля обязательны в api, когда вы вызываете api ... id, тема, candelete, new_m и т. д. или они находятся в ответе?

Devil10 25.07.2018 08:56

Я не уверен, мне нужно получить список новых сообщений, и я подумал, что мне нужно вставить все эти поля в интерфейс)) может они и не требуются. Я только новичок в разработке Android.

Andrew 25.07.2018 09:00

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

Devil10 25.07.2018 09:04

Я изменил свой вопрос, возможно, эти детали прояснят мою задачу.

Andrew 25.07.2018 09:08

поэтому в соответствии с вашим кодом эти классы должны иметь hastebin.com/beruhepuwo.http

Devil10 25.07.2018 09:22

используйте эти способы .. вы можете изменить имя класса в соответствии с вами .. потому что ваш URL-адрес требует только одного параметра

Devil10 25.07.2018 09:23

и использовать токен доступа в разделе авторизации

Devil10 25.07.2018 09:32

У меня есть решение ... вы должны пройти через это

Devil10 25.07.2018 09:33
0
12
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Модернизация интерфейса

 @Headers({"Content-type: application/json"})
@GET("/v1/message")
Call<MessageResponse> getInMess(@Header("Authorization") String authorization, @Query("type") Integer type);

СообщениеОтвет

import java.util.List;
public class MessageResponse {
private Integer count;
private List<Message> messages = null;
private String next_url;
private String previous_url;

public Integer getCount() {
return count;
}
public void setCount(Integer count) {
 this.count = count;
 }


public List<Message> getMessages() {
 return messages;
}

public void setMessages(List<Message> messages) {
 this.messages = messages;
}

public String getNext_url() {
 return next_url;
}

public void setNext_url(String next_url) {
this.next_url = next_url;
}

public String getPrevious_url() {
 return previous_url;
}

public void setPrevious_url(String previous_url) {
 this.previous_url = previous_url;
}

}

Сообщение

public class Message {

private Integer id;
private String subject;
private Integer can_delete;
private Integer _new;
private String date;
private String receiver_name;
private String sender_name;

public Integer getId() {
 return id;
}

public void setId(Integer id) {
 this.id = id;
 }

public String getSubject() {
 return subject;
}

public void setSubject(String subject) {
 this.subject = subject;
}


public Integer getCan_delete() {
 return can_delete;
}

public void setCan_delete(Integer can_delete) {
 this.can_delete = can_delete;
}

public Integer getNew() {
 return _new;
}

public void setNew(Integer _new) {
 this._new = _new;
}

public String getDate() {
 return date;
}

public void setDate(String date) {
 this.date = date;
}

public String getReceiver_name() {
 return receiver_name;
}

public void setReceiver_name(String receiver_name) {
 this.receiver_name = receiver_name;
}

public String getSender_name() {
 return sender_name;
}

public void setSender_name(String sender_name) {
 this.sender_name = sender_name;
}

}

Спасибо за ваш ответ, но я до сих пор не могу понять, как мне инициализировать следующий интерфейс в моем классе mainactivity, я нашел совет использовать что-то вроде этого: mAPIService.getInMess (a) .enqueue (new Callback <MessageAnswer> () {}. но я должен инициализировать переменную a.

Andrew 25.07.2018 09:42

Ага. при создании клиента Retrofit этот интерфейс будет использоваться в этом клиенте как услуга. и это создаст этот mAPIService, например

Devil10 25.07.2018 09:46

mAPIService = retrofit.create (Interface.Class) предоставит вам mAPIService

Devil10 25.07.2018 09:47

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

Andrew 25.07.2018 09:53

убедитесь, что вы входите в accesstoken

Devil10 25.07.2018 09:54

Есть два способа использовать accesstoken .. помещать непосредственно в раздел заголовка или использовать в модифицированном клиенте.

Devil10 25.07.2018 09:55

В моем интерфейсе вы можете увидеть мой ACCESS_TOKEN, я не уверен, но, может быть, мне придется скопировать токен доступа из моего ответа на авторизацию и вставить в свой заголовок?

Andrew 25.07.2018 09:57

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

Devil10 25.07.2018 10:02

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

Andrew 25.07.2018 10:04

второй подход заключается в том, что вы должны сохранить этот токен в переменной в классе приложения, и когда вы создаете модифицированный клиент для вызова, вам необходимо добавить авторизацию и другие заголовки в перехватчике httpclient, который содержит значение из этой сохраненной переменной, поэтому всякий раз, когда вы вызываете этот модифицированный клиент вы автоматически вызываете токен и не нужно добавлять отдельно

Devil10 25.07.2018 10:34

Другие вопросы по теме