多个@Body 字段出错 - retrofit2 beta3
error with more than one @Body field - retrofit2 beta3
我刚开始为 android 进行改造。当我尝试为 post 请求的主体指定 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);
创建调用时发生错误(没有机会执行它)。
当我删除其中一个正文字段时,它似乎工作正常。
有什么想法吗?
使用多个@Body 是个坏主意,因为这里的@Body 表示 HTML POST.
的消息正文
(详情:)
我建议您定义一个包含用户名和密码的 class,如下所示。
public class LoginInformation {
String username;
String password;
}
然后,在 class 实例上填写您的信息,然后使用它。
@POST("auth/login")
Call<UserData> login(@Body LoginInformation loginInformation);
任何 HTTP 请求只允许包含一个 message body ,如果您尝试添加两个 @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);
请记住,服务器端必须正确实施它才能以地图形式接收数据。
我刚开始为 android 进行改造。当我尝试为 post 请求的主体指定 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);
创建调用时发生错误(没有机会执行它)。 当我删除其中一个正文字段时,它似乎工作正常。
有什么想法吗?
使用多个@Body 是个坏主意,因为这里的@Body 表示 HTML POST.
的消息正文(详情:)
我建议您定义一个包含用户名和密码的 class,如下所示。
public class LoginInformation {
String username;
String password;
}
然后,在 class 实例上填写您的信息,然后使用它。
@POST("auth/login")
Call<UserData> login(@Body LoginInformation loginInformation);
任何 HTTP 请求只允许包含一个 message body ,如果您尝试添加两个 @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);
请记住,服务器端必须正确实施它才能以地图形式接收数据。