在Android中使用Retrofit2在@Body中发送多个参数(Sending multiple parameters in @Body with Retrofit2 in Android)
当我进行Put-call时,我想在Body中发送多个参数。 但是Retrofit不允许我在相同的方法中使用@Body注解两次。 这是它的外观:
@PUT("/applicant/{id}")
Call sendAnswers(@Path("id")int id, @Body String s_id, @Body List listOfAnswers);
我该如何解决这个问题?
I want to send multiple parameters in the Body when i do my Put-call. But Retrofit does not allow me to use the @Body annotation twice in the same method. This is how it looks:
@PUT("/applicant/{id}")
Call sendAnswers(@Path("id")int id, @Body String s_id, @Body List listOfAnswers);
How can I solve this?
原文:https://stackoverflow.com/questions/42668156
更新时间:2020-07-26 21:07
最满意答案
创建一个pojo:
public class Answer {
private String s_id;
private List listOfAnswers;
public String getS_id() {
return s_id;
}
public void setS_id(String s_id) {
this.s_id = s_id;
}
public List getListOfAnswers() {
return listOfAnswers;
}
public void setListOfAnswers(List listOfAnswers) {
this.listOfAnswers = listOfAnswers;
}
}
然后将其设置为body:
@PUT("/applicant/{id}")
Call sendAnswers(@Path("id")int id, @Body Answer answer);
Create a pojo :
public class Answer {
private String s_id;
private List listOfAnswers;
public String getS_id() {
return s_id;
}
public void setS_id(String s_id) {
this.s_id = s_id;
}
public List getListOfAnswers() {
return listOfAnswers;
}
public void setListOfAnswers(List listOfAnswers) {
this.listOfAnswers = listOfAnswers;
}
}
then set it as body:
@PUT("/applicant/{id}")
Call sendAnswers(@Path("id")int id, @Body Answer answer);
2017-03-08
相关问答
如后期Retrofit 2 - 动态URL中所述, @Url表示法假定String是完全定义的URL,并且不检查它是否包含@Path变量。 要使用@Path注释,您必须配置端点URL并在@GET()注释中包含@Path变量。 As described in the post Retrofit 2 - Dynamic URL, the @Url notation assumes that the String is a fully defined URL and does not check whe
...
你需要某种依赖注入。 试试这个代码。 在致电您的服务之前,请致电 ApiManager.setHeaders(map of headers);
带标题值。 使用空地图调用或使用null来排除它们。 public class ApiManager {
public final static String BASE_URL = "URL";
private static ApiManager instance =null;
private ApiModule apiModule;
pub
...
创建一个pojo: public class Answer {
private String s_id;
private List listOfAnswers;
public String getS_id() {
return s_id;
}
public void setS_id(String s_id) {
this.s_id = s_id;
}
public List
...
最后我发现解决方案希望这将有助于其他 我通过使用FieldMap来实现解决方案 的改造。 @POST("initiate")
@FormUrlEncoded
Call getUserInfoRequest(@FieldMap Map params);
在Rest适配器部分中,我将字符串的请求数据更改为Hashmap形式,如下所示 Log.d(TAG, "sendUserInfo called");
UserInfo
...
你有没有试过检查你的改造请求的日志? 例如,可能是标题,请求参数甚至全服务URL可能不同于POSTMAN请求。 检查下面的答案以启用登录您的改造请求并将请求与邮递员进行比较: https : //stackoverflow.com/a/33256827/4862126 我还发现可能发生的情况: 404:未找到 当请求的资源(使用提供的ID)从未存在时 当访问用户无法访问的API时。 响应: {
"error": {
"errors": [
{
"domain": "global
...
我是基于Retrofit2解决您的问题,请注意这一点! 首先,在builde.gradle文件中,添加以下依赖项: compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
然后初始化Retrofit: Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://ap
...
//在Request Client API接口中 @Multipart
@POST("URL.json")
Call loginPicture(@PartMap() Map mapPhoto); //multi part
//在活动中 private void Dialog_profile_pic(final Uri selectedImageUri) {
// create upload servic
...
这就是我如何解决它: Flowable.zip>(
postService.getUser(postId),
postService.getCommentsByPostId(postId),
BiFunction { user, comments -> Pair(user, comments) })
.subscribeOn(Schedulers.io())
.ob
...
不确定为什么logcat没有显示任何有用的东西。 但是在执行它时,它会给出一个android.os.NetworkOnMainThreadException ,它可以解释这个问题。 正如他们在评论中所说:尝试使用enque方法和回调,这也允许你摆脱try / catch语句。 尝试在MainActivity中使用// Service setup后替换代码: HttpBinService service = retrofit.create(HttpBinService.class);
...
使用多个@Body不是个好主意,因为@Body在这里意味着HTML POST的消息体。 (详细: 使用HTML表单时如何在HTTP请求正文中发送数据? ) 我建议你定义一个包含用户名和密码的类,如下所示。 public class LoginInformation {
String username;
String password;
}
并且,填写您的关于该类实例的信息,并使用它。 @POST("auth/login")
Call login(@Body L
...