6

我刚刚开始为 android 进行改造。当我尝试为发布请求的正文指定 2 个字段时出现错误:

找到多个 @Body 方法注释。(参数#2)方法

调用在我的 API 接口文件中定义为:

@POST("auth/login")
Call<UserData> login(@Body String username, @Body String password);

我通过以下方式创建呼叫:

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

APIService service = retrofit.create(APIService.class);
Call<UserData> call = service.login(username, password);

创建调用时会产生错误(没有机会执行它)。当我删除其中一个身体字段时,它似乎工作正常。

有任何想法吗?

4

2 回答 2

15

使用多个@Body 是个坏主意,因为这里的@Body 表示HTML POST 的消息正文。

(详情:使用 HTML 表单时如何在 HTTP 请求正文中发送数据?

我建议你定义一个包含用户名和密码的类,如下所示。

public class LoginInformation {
    String username;
    String password;
}

并且,在该类实例上填写您的信息,然后使用它。

@POST("auth/login")
Call<UserData> login(@Body LoginInformation loginInformation);
于 2016-01-08T00:57:34.850 回答
6

任何 HTTP 请求只允许包含一个消息体,如果您尝试添加两个@Body参数,您将收到此消息"Multiple @Body method annotations found."

您可以按照以下方法修复它:

您可以使用或单一类型同时发送多个或不同类型的对象HashMap,例如:

HashMap<String, Object> map = new HashMap<>();
map.put("password", "123456");
map.put("username", "Jake Warthon");

或者

public class User(){
    private String username;
    private String password;

    public void setUsername(String username){
        this.username = username;
    }

    public void setPassword(String password){
        this.password = password;
    }
}

User user = new User(); 
user.setUsername("Jake Warthon")
user.setPassword("123456");
map.put("user", user);

如果需要,您可以在单个正文中附加更多数据(如不同类型的对象)(可选)

map.put("user", user);
map.put("authorization", "12uh3u12huhcd2");
map.put("something", someobject);

您必须更改请求的主体类型才能接收 Hashmap 或 User

@POST("auth/login")
Call<UserData> login(@Body HashMap map);

或者

@POST("auth/login")
Call<UserData> login(@Body User user);

最后,您像以前一样将数据传递给服务。

Call<UserData> call = service.login(map); 

或者

Call<UserData> call = service.login(user); 

请记住,服务器端必须正确实现它才能以地图的形式接收数据。

于 2016-01-08T01:31:01.400 回答