Я пытаюсь создать простое приложение для получения списка новых сообщений с сервера. Для решения следующей задачи я использую библиотеку 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. После прочтения учебника я создал следующие классы, но я не могу понять способ сортировки моих полей на два класса, и я также не уверен в своем интерфейсе для моего запроса. Может быть, кто-нибудь из вас знает, как я могу решить следующую проблему.
спасибо, но я не могу понять, как после этого я могу инициализировать следующий интерфейс в классе mainactivity, потому что, когда я затем пишу Call <List <MessageAnswer>> listCall = mAPIService.getInMess (a, b, c); Мне нужно инициализировать все переменные, которые потребуют всех полей в моем интерфейсе. И я должен дать им некоторую ценность. Это правда?
эти переменные - параметры, необходимые для вызова вашего API. Вставьте сюда URL-адрес и ответ в формате json, чтобы лучше понять вашу проблему.
Я не могу дать вам URL-адрес и ответ в формате json, потому что сейчас я не могу выполнить ни один запрос GET со следующим кодом.
эти поля обязательны в api, когда вы вызываете api ... id, тема, candelete, new_m и т. д. или они находятся в ответе?
Я не уверен, мне нужно получить список новых сообщений, и я подумал, что мне нужно вставить все эти поля в интерфейс)) может они и не требуются. Я только новичок в разработке Android.
это зависит от вашего api, потому что, если эти поля требуются, тогда эти поля вы должны указать при вызовах api ... в противном случае эти поля придут в форме ответа, которого вы ожидаете. просто убедитесь, что вашему api нужно от вас, чтобы обеспечить результат, и какой тип json вы получаете
Я изменил свой вопрос, возможно, эти детали прояснят мою задачу.
поэтому в соответствии с вашим кодом эти классы должны иметь hastebin.com/beruhepuwo.http
используйте эти способы .. вы можете изменить имя класса в соответствии с вами .. потому что ваш URL-адрес требует только одного параметра
и использовать токен доступа в разделе авторизации
У меня есть решение ... вы должны пройти через это
Модернизация интерфейса
@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.
Ага. при создании клиента Retrofit этот интерфейс будет использоваться в этом клиенте как услуга. и это создаст этот mAPIService, например
mAPIService = retrofit.create (Interface.Class) предоставит вам mAPIService
Я не уверен, помогло ли мне ваше решение, потому что у меня возникла ошибка, связанная с токеном доступа с моего сервера.
убедитесь, что вы входите в accesstoken
Есть два способа использовать accesstoken .. помещать непосредственно в раздел заголовка или использовать в модифицированном клиенте.
В моем интерфейсе вы можете увидеть мой ACCESS_TOKEN, я не уверен, но, может быть, мне придется скопировать токен доступа из моего ответа на авторизацию и вставить в свой заголовок?
Я обновил ответ ... теперь я переместил параметр токена доступа в запрос ... попробуйте это, когда вы вызываете этот api, добавьте свой токен доступа и введите ... надеюсь, что это сработает, и если нет, я покажу вам рабочий пример что я сделал ранее. но это будет немного длинновато
ваш ответ довольно крутой, но, как я понял, мне нужно получить токен доступа из моего предыдущего запроса успеха, а затем я должен вставить его в заголовок? может ты дашь мне свой пример для лучшей работы?
второй подход заключается в том, что вы должны сохранить этот токен в переменной в классе приложения, и когда вы создаете модифицированный клиент для вызова, вам необходимо добавить авторизацию и другие заголовки в перехватчике httpclient, который содержит значение из этой сохраненной переменной, поэтому всякий раз, когда вы вызываете этот модифицированный клиент вы автоматически вызываете токен и не нужно добавлять отдельно
поместите свой класс сообщения в Call <List <ClassName>>. это будет отражать ответ в этом типе, который вы можете просто использовать в адаптере listView / RecyclerView