【问题标题】:Which structure of project for GET request retrofit android I have to create?我必须为 GET 请求改造 android 创建哪个项目结构?
【发布时间】:2019-01-01 20:36:56
【问题描述】:

我正在尝试创建一个简单的应用程序,用于从服务器获取新消息列表。我使用Retrofit 库来解决以下任务。我已经阅读了几个代码源,写了一些问题,但我遇到了更多困难。首先,我将向您展示我的请求的当前结构。


服务器请求:

网址 https://my_server/v1/message/list

方法 获取

HTTP Header - Authorization:Bearer $access_token

网址参数 类型 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>。这将反映这种类型的响应,您可以简单地在 listView/RecyclerView 的适配器中使用它
  • 谢谢,但我不明白如何在 mainactivity 类初始化以下接口,因为当我写 Call> listCall = mAPIService.getInMess(a ,公元前);我必须初始化所有需要界面中所有字段的变量。我必须给他们一些价值。是真的吗?
  • 这些变量是调用你的api需要的参数。在此处粘贴 url 和 json 响应,以便更好地理解您的问题
  • 我不能给你任何 url 和 json 响应,因为我现在不能用下面的代码做任何 GET 请求。
  • 调用api时这些字段在api中是必需的吗...id、subject、candelete、new_m等还是响应?

标签: android get retrofit retrofit2


【解决方案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(){}。但我必须初始化变量a。
  • 是的。当您创建 Retrofit 客户端时,此接口将用作该客户端中的服务。这将创建这个 mAPIService 像
  • mAPIService=retrofit.create(Interface.Class) 会给你mAPIService
  • 我不确定您的解决方案是否对我有帮助,因为我在连接服务器的访问令牌时遇到错误
  • 确保您正在输入访问令牌
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2018-03-31
  • 1970-01-01
  • 2013-10-14
  • 2013-12-23
相关资源
最近更新 更多