【问题标题】:Java - Retrofit 2 requests good practicesJava - Retrofit 2 请求良好实践
【发布时间】:2015-11-03 15:41:57
【问题描述】:

我目前正在对 Android 应用程序进行改造。 这对我来说很新,我正在尝试找出处理简单请求而又不会弄乱的最佳方法。

我的客户端正在使用 JSON(改造的 JacksonConverter)与我的服务器通信。 所以现在,我最终做了这样的事情:

public interface MyWebService {

    class RequestLogin {
        public String email;
        public String hash;

        public RequestLogin(String email, String hash) {
            this.email = email;
            this.hash = hash;
        }
    }

    @POST("/login")
    Call<String> login(@Body RequestLogin body);

}

public void someFunction() {
    Call<String> call = serviceInstance.login(new RequestLogin("some_mail", "some_hash"));
}

在这里你可以看到我的/login 路由采用了一个简单的 JSON:

{
  "email": "some_email_here",
  "hash": "some_passwd_hash_here"
}

并在正文中返回一个简单的字符串。

还不错,但我担心事情会随着时间的推移而变得一团糟。

创建对象是在使用改造的请求正文中使用 JSON 的唯一方法吗?

也许有一种方法可以代替:

@POST("/login")
Call<String> login(@MagicTag String email, @MagicTag String hash);

我可能在图书馆的 javadoc 中遗漏了它,但是当您从未使用过它时,该网站不是很清楚。如果它存在,我没有找到任何使用它的样本。

【问题讨论】:

    标签: java android json retrofit


    【解决方案1】:

    在:http://square.github.io/retrofit/:

    格式编码和多部分

    方法也可以声明为发送表单编码和多部分数据。

    当方法上存在@FormUrlEncoded 时发送表单编码数据。每个键值对都使用 @Field 进行注释,其中包含名称和提供值的对象。

    @FormUrlEncoded @POST("/user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

    在你的情况下应该是:

    @FormUrlEncoded @POST("/login") Call<String> login(@Field("email") String email, @Field("hash") String hash);

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答。我认为 @FormUrlEncoded 用于暗示在 URL 中添加参数,而不是在 JSON 中的正文中。我会尽快尝试并通知您
    • 抱歉耽搁了。我试过了,它不起作用。正如预期的那样,它作为表单而不是在请求正文中发送到服务器。
    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多