我使用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;]}。
请帮助我!
答案 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获取数据。
建议:如果您遇到同样的问题,请检查网址改装返回以及与正确的网址进行比较,以查看未转换为网址编码的特殊字符。