【问题标题】:How to post array in retrofit android如何在改造android中发布数组
【发布时间】:2016-09-12 06:16:31
【问题描述】:

如何通过 post 方法在改造中发布以下参数?

 "params":{"body": {
    "learning_objective_uuids": [
      "ED4FE2BB2008FDA9C8133FF462959C0968FAB98C4D1DB8F2"
    ],
    "note": "FasfAFSASFASDF",
    "user_uuids": [
      "EDF8B7EC20005ACC5C40FF7D6E988801F5BAD83CBBCDB97F",
      "EDF8F78F2000569C64101F244AA20C0070D2A7FCB1939E19"
    ]
  }
}
} }

【问题讨论】:

  • 哪个参数?参数多于一个...
  • 这些参数: - “learning_objective_uuids”:[ “ED4FE2BB2008FDA9C8133FF462959C0968FAB98C4D1DB8F2”], “注释”: “FasfAFSASFASDF”, “user_uuids”:[ “EDF8B7EC20005ACC5C40FF7D6E988801F5BAD83CBBCDB97F”, “EDF8F78F2000569C64101F244AA20C0070D2A7FCB1939E19”]}}} 跨度>
  • 我在下面写了答案..
  • 当您投反对票时,请在 cmets 中输入任何理由。我认为这是建设性的方式
  • @Revenge ,我不知道为什么有些愚蠢的人会否决这个问题。这是一个真正的问题。你觉得呢?

标签: android retrofit


【解决方案1】:
@FormUrlEncoded
@POST("service_name") 
   void functionName(
        @FieldMap Map<String, String> learning_objective_uuids, @FieldMap Map<String, String> user_uuids, @Field("note") String note,
        Callback<CallBackClass> callback
    );

更好的解决方案:使用arraylist..参考链接:johnsonsu

@FormUrlEncoded
    @POST("service_name") 
       void functionName(
            @Field("learning_objective_uuids[]") ArrayList<String> learning_objective_uuids, @Field("user_uuids[]") ArrayList<String> user_uuids, @Field("note") String note,
            Callback<CallBackClass> callback
        );

【讨论】:

  • 得到以下响应:- retrofit.RetrofitError: 400 Bad Request
  • 把你自己写的函数放上去。
  • 好兄弟,你能告诉我什么是“lost_project_reasons[]”吗?
  • 感谢您的回答,使用 arrayList 的第二个解决方案有效! +1
  • 您也可以像这样将数组作为 int[] 或 long[] 发送:@Field("lost_project_reasons[]") int[] learning_objective_uuids
【解决方案2】:

查看这个我需要将注册字段数据作为 json 请求传递的示例

@POST("magento2apidemo/rest/V1/customers")
Call<RegisterEntity> customerRegistration(@Body JsonObject registrationData);

这里我创建了registrationData是

private static JsonObject generateRegistrationRequest() {
        JSONObject jsonObject = new JSONObject();
        try {
            JSONObject subJsonObject = new JSONObject();
            subJsonObject.put("email", "abc@xyz.com");
            subJsonObject.put("firstname", "abc");
            subJsonObject.put("lastname", "xyz");

            jsonObject.put("customer", subJsonObject);
            jsonObject.put("password", "password");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        JsonParser jsonParser = new JsonParser();
        JsonObject gsonObject = (JsonObject) jsonParser.parse(jsonObject.toString());
        return gsonObject;
    }

【讨论】:

  • 唯一需要注意的是“当你想将数组发送到服务器时,将该值添加到 JsonArray 并将其放入 JsonObject 中。”
【解决方案3】:

从今天开始,运行 Retrofit implementation 'com.squareup.retrofit2:retrofit:2.1.0'

这很好用……

@FormUrlEncoded
@POST("index.php?action=item")
Call<Reply> updateManyItem(@Header("Authorization") String auth_token, @Field("items[]") List<Integer> items, @Field("method") String method);

你可以忽略@Header@Field("method") ....主要是@Field("items[]") List&lt;Integer&gt; items

这是允许您发送项目的原因。在 API 方面,我只是在寻找一个整数数组,这非常有效。

【讨论】:

  • 我唯一忘记的是字段名称后面的“[]”。非常感谢!
【解决方案4】:

去这个网站:JSON Schema 2 POJO

粘贴您的示例 Json 格式,然后

选择源类型:JSON,注释样式:无

然后创建一个 POJO 类,例如你的类名:MyPOJOClass

然后在你的 Api 中:

@POST("endpoint")
public Call<Void> postArray(@Body MyPOJOClass mypojoclass);

如果你也有标题,你可以将它们添加到这样的参数中:

@Header("Accept") String accept,@Header("Content-Type") String contentType

@Edit : 对于您的评论,请查看我的答案:how-to-use-gson-2-0-on-onresponse-from-retrofit-2-0

【讨论】:

  • 目前我正在使用这种方法:- @POST(Constants.POST_UPLOAD_NOTES) public void postNotes(@Body JSONArray jsonArray ,@Query("note") String note, Callback callback); }
  • 查看我的@Edit 部分,您可以找到示例请求以及如何处理响应。您可以结合两个答案
【解决方案5】:

我找到了一个新的解决方法:

您可以将其作为字符串发送:

@POST("CollectionPoints")
@FormUrlEncoded
Call<SomeResponse> postSomething(@Field("ids")String ids);

并像这样发送传递:

Call<SomeResponse> call = service.postSomething("0","0", Arrays.toString(new int[]{53551, 53554}));

最好的问候!

【讨论】:

    【解决方案6】:

    Gson 是 JSON 对象/数组相关问题的最佳解决方案。

    在这里,我将分享我在改造 API 中传递数组类型值的最简单解决方案

    id: ArrayList<String> //Already initilized 
    status: String  //Already initilized 
    
    val jsonObject = JsonObject()
    val toJson = Gson().toJsonTree(id) //Only one line to covert array JsonElement
    
    jsonObject.add("id", toJson) //Add Json Element in JsonObject
    
    jsonObject.addProperty("status", status)
    

    使用jsonObject进行API调用

    @POST("API_END_POINT")
    fun changeStatusOfList(@Body jsonObject: JsonObject): Observable<Response<RETURN_TYPE>>
    

    日志输出:

    {"id":["426","427"],"status":"1"}
    

    【讨论】:

      【解决方案7】:

      如果您想发送同名列表,那么在改造 2 中唯一对我有用的是使用 @Query

      @FormUrlEncoded
      @POST("service_name") 
         void functionName(
              @Query("category") List<Int> categories
          );
      

      这会像这样发送它:https://example.com/things?category=100&amp;category=101&amp;category=105

      接受的答案似乎在 Retrofit2 中不起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-14
        • 2020-07-25
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多