【问题标题】:Retrofit + GET method + www-form-urlencoded in AndroidAndroid 中的改造 + GET 方法 + www-form-urlencoded
【发布时间】:2017-06-07 06:19:44
【问题描述】:

我正在尝试从服务器获取列表。问题是,Retrofit 2.0 正在将我的请求转换为我的服务器不接受的编码请求。所以我需要从请求中删除自动编码。我通过将encoded = true/false 放入请求中尝试了几乎所有解决方案,但它根本不起作用。

现在,情况是:“POST”请求一切正常。有没有类似的方法可以通过“GET”调用来做到这一点?由于编码的 URL,GET 请求给了我“400 Bad Request”。 GET 编码的主要问题。

POST 调用:

工作岗位

@FormUrlEncoded
    @POST("login")
    Call<UserBean> getLogin(@FieldMap Map<String,String> params);

POST ENCODED URL:(工作)

https://---.---.com/---/webservice/login?
jhobject=%7B%22data%22%3A%22%7B%5C%22username%5C%22%3A%5C%22abz%40cbv.com%5C%22%2C%5C%22password%5C%22%3A%5C%221234%40567%5C%22%2C%5C%22manufacturername%5C%22%3A%5C%22Android%5C%22%2C%5C%22modelname%5C%22%3A%5C%22XT1068%5C%22%2C%5C%22osversion%5C%22%3A%5C%223.4.42-g0a0ded4%5C%22%2C%5C%22countrycode%5C%22%3A%5C%22in%5C%22%2C%5C%22appversion%5C%22%3A%5C%221.0%5C%22%2C%5C%22imei%5C%22%3A%5C%22353325060286683%5C%22%2C%5C%22appfor%5C%22%3A%5C%22Sony%5C%22%7D%22%2C%22enc%22%3A%220%22%7D

GET 不工作

 @Headers({"Content-Type:application/x-www-form-urlencoded"})
    @GET("getlisting")
    Call<MyBean> getListing(@QueryMap Map<String,String> params);

GET ENCODED URL:(不工作)

    https://---.---.com/---/webservice/getlisting?
 jhobject=%257B%2522data%2522%253A%257B%2522pageno%2522%253A%25221%2522%252C%2522totalpages%2522%253A%25220%2522%252C%2522recordperpages%2522%253A%252210%2522%252C%2522cstatus%2522%253A%25221%2522%252C%2522reportid%2522%253A%252253%2522%257D%252C%2522enc%2522%253A%25220%2522%252C%2522token%2522%253A%252209046d74-c047-4534-be0b-050dadad18b8%257E%257E23717%2522%257D

【问题讨论】:

  • 而不是发送 json 对象尝试类似 @GET("maps/api/place/nearbysearch/json") Call getNearBySearchList(@Query("location") String location, @Query ("types") 字符串类型,@Query("key") 字符串键,@Query("rankby") String rankby);
  • 不,它在 Postman 中不起作用。
  • 添加您的获取网址

标签: android get retrofit retrofit2 url-encoding


【解决方案1】:

你正在做双重编码

在帖子中

jhobject=%7B

在获取

jhobject=%257B

【讨论】:

  • 我知道双重编码,但仍然无法正常工作。
  • @QueryMap (encoded = true) Map&lt;String,String&gt; params你试过了吗
【解决方案2】:

我遇到了同样的问题,直到我删除这行 @FormUrlEncoded 似乎 GET 不需要编码或者我不理解那部分 您可能想删除代码中的这一行并尝试@Headers({"Content-Type:application/x-www-form-urlencoded"})

【讨论】:

    【解决方案3】:

    我在使用 GET 和改造时遇到了同样的问题,这是改造的解决方案

    1- 加载 URL 服务器:

    改造改造 = new Retrofit.Builder().baseUrl("URL") .addConverterFactory(GsonConverterFactory.create()).build(); service = retrofit.create(CallApiService.class);

    2- 加载配置 api:

    public interface CallApiService {
    @GET("URI")
        Call<ResponseBody> getProfessions( @Header("x-req-user-id") String x_req_user_id);
    }
    

    3- 调用api和映射数据:

    RetrofitLoader retrofitLoader = new RetrofitLoader();
    CallApiService service = retrofitLoader.getServiceLoader();
    Call<ResponseBody> retrofitCall = service.getProfessions("8");
    LOGGER.info("conncet to url  :  GET  " + retrofitCall.request().url());
    Response<ResponseBody> response;
    try {
        response = retrofitCall.execute();
        if (!response.isSuccessful())
            throw new IOException("Unexpected code " + response);
        String responseData = response.body().string();
        LOGGER.info("getProfessions Data : " + responseData);
        try {
            JSONObject jsonObject = new JSONObject(responseData);
            return jsonObject.toString();
        } catch (JSONException e) {
            LOGGER.error("Error jsonObject : " + e);
        }
    
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    return "";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 2013-06-26
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多