响应代码400错误请求在查询标记中使用Json String param改造2 Android

时间:2017-06-23 05:02:49

标签: android json retrofit2

我使用Retrofit 2在Android App中调用API。我有一个使用POST的API,它在查询标记中有一个String参数。我做了像doc假设的所有事情,我在Test Page中成功测试了这个API。我可以正确运行另一个API,所以问题不在于我使用Retrofit 2的方式。 这是我的界面:

@POST("/users/{userId}/get_list_friends")
    Call<GetListFriendDataResponse> getListFriend(@Path("userId") int userId, @Query("list") String list, @Query("page") int page, @Query("size") int size, @Header("hash") String hash);

这是我的实施:

ArrayList<String> id = new ArrayList<>();
        id.add("4782947293");
        JSONArray jsonArray = new JSONArray(id);
        JSONObject jsonObject = new JSONObject();

        try {
            jsonObject.put("list", jsonArray);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String list = jsonObject.toString();
            Log.e(TAG, "list: " + list);
        apiInterface.getListFriend(21, list, 1,1,"AHHIGHTJGI").enqueue(new Callback<GetListFriendDataResponse>() {
            @Override
            public void onResponse(Call<GetListFriendDataResponse> call, Response<GetListFriendDataResponse> response) {
                Log.e(TAG, " response code: "+ response.code());
                               }

            @Override
            public void onFailure(Call<GetListFriendDataResponse> call, Throwable t) {

            }
        });

我总是得到响应代码:使用此API时为400。 我正在关注&#34;列表&#34;变种。 &#34;列表&#34;是一个JSON文本,但我想知道方法&#34; jSon.toString()&#34;从JSONObject获取一个String是正确的,它可以在Retrofit 2中使用。列表参数形式是:{&#34; list&#34;:[&#34; 12332&#34;]}。

请帮助我!

2 个答案:

答案 0 :(得分:0)

问题 1)为什么要自己创建JSONObject和JSONArray? 2)您正在使用创建json的任何内容创建字符串。 例如:{list:[&#34; 123&#34;,&#34; 456&#34;]} 你想尝试传递整个json,而不是只需要将字符串数组传递给列表键。

请求发送

{
 list:["123","456"]
}

假设上面的json是您要发送给服务器的请求 现在,创建模型类goto http://jsonschema2pojo.org并粘贴你的json并在右侧选择json和gson并单击预览。

它将显示将json映射到模型的类。使用此模型类将列表设置为json

中的键

答案 1 :(得分:0)

我发现了我的问题。 JSON文本包含一些特殊字符,因此我需要将它们转换为URL编码。 正确的请求URL如下:

http://54.169.215.161:8080/users/29/add_friend?list=%7B%22list%22%3A%5B%2215536%22%5D%7D&platform=google

通过使用Retrofit 2,它使用URL:

http://54.169.215.161:8080/users/29/add_friend?list={%22list%22:[%2215536%22]}&platform=google

所以我得到错误的请求响应代码。 Retrofit 2还提供了将char序列转换为URL编码的方法,但这还不够。因此,我不使用此代码使用Retrofit的转换方法:encode = true。 所以我的界面是:

@POST("/users/{userId}/get_list_friends")
    Call<GetListFriendDataResponse> getListFriend(@Path("userId") int userId, @Query(value = "list",encoded = true) String list, @Query("page") int page, @Query("size") int size, @Header("hash") String hash);

我通过代码手动将JSON文本转换为URL编码:

        list = list.replace("{", "%7B");
        list=list.replace("]", "%5D");
        list=list.replace("[", "%5B");
        list=list.replace(":", "%3A");
        list=list.replace("}","%7D");
        list = list.replace("\"", "%22");

这就是全部。现在我可以使用API​​获取数据。

建议:如果您遇到同样的问题,请检查网址改装返回以及与正确的网址进行比较,以查看未转换为网址编码的特殊字符。