使用UrlEncoded对象进行改造

时间:2016-01-02 14:09:27

标签: android retrofit

我无法找到有关此主题的正确信息。问题已经提到,但没有正确的解决方案。请求没问题,如:

@FormUrlEncoded
@POST("/guide/confirm")
Call<Model> confirm(@Field("step") String step,  @Field("code") String code);

但是,正确的(!)方式会对所有对象进行编码,该对象具有三个或更多其他对象列表。使用UrlEncoded进行大多数转换的父对象和子对象字段。

// What need to do, to encode all data below?
@POST("/guide/loadinfo")
Call<Model> confirm(@Body VeryBigJsonObject object);

使用TypedObject有解决方案 - 但现在不推荐使用函数,并且它不是新的改进。我希望你能提供帮助。

杰克沃顿在一些问题上说,我的json不是url enoded形式(它太大了)。这是不是意味着,我无法使用Retrofit将我的请求发送到服务器?一些例子json:http://www.jsoneditoronline.org/?id=661b2bae9eb520902825a58f8d44c338

1 个答案:

答案 0 :(得分:0)

使用form-urlencoded发送整个类有很多麻烦,因为我们的服务器不允许使用json。

我不认为这是正确的方法,但我找不到更好的解决方案。 (我尝试按字段发送我的类,但改造无法正确编码字段中的数组)

花了很多时间后,我这样做了:

public static RequestBody objectToRequestBody(Object obj)
{
    String jsonString = new Gson().toJson(obj);

    String reqestText = "";
    try {
        Object jsonObj = new JSONObject(jsonString);
        reqestText = Tools.jsonToURLEncodingAux(jsonObj,"",0);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String mediaType = "application/x-www-form-urlencoded";
    return RequestBody.create(okhttp3.MediaType.parse(mediaType), reqestText);
}

public static String jsonToURLEncodingAux(Object json, String prefix, int level) {
    String output = "";
    if (json instanceof JSONObject) {
        JSONObject obj = (JSONObject)json;
        Iterator<String> keys1 = obj.keys();
        while (keys1.hasNext())
        {
            String currKey = keys1.next();
            String subPrefix = "";
            if(level>0) {
                subPrefix = prefix + "[" + currKey + "]";
            } else {
                subPrefix = prefix + currKey;
            }
            try {
                output += jsonToURLEncodingAux(obj.get(currKey), subPrefix, level + 1);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    } else if (json instanceof JSONArray) {
        JSONArray jsonArr = (JSONArray) json;
        int arrLen = jsonArr.length();

        for (int i = 0; i < arrLen; i++) {
            String subPrefix = prefix + "[" + i + "]";
            Object child = null;
            try {
                child = jsonArr.get(i);
                output += jsonToURLEncodingAux(child, subPrefix, level + 1);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    } else {
        output = prefix + "=" + json.toString() + "&";
    }
    return output;
}

接口:

@Headers("Cache-Control: max-age=259200")
@POST("api/route/report/")
Observable<ReportResponsePOJO> sendReport(
        @Header("Content-Type") String content_type,
        @Body RequestBody report
);

并像这样发送

Observable<ReportResponsePOJO> myResponsePOJOObservable = apiInterface
            .sendReport(
                    "application/x-www-form-urlencoded",
                    objectToRequestBody(report))
            .subscribeOn(Schedulers.io());

我希望它能起作用,至少对我而言。