2016-01-02 2 views
1

Не удалось найти правильную информацию по этому вопросу. Проблема уже упоминалась, но правильного решения нет. Нет проблемы с запросом, как: (!)Модернизация с объектом UrlEncoded

@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 - но теперь функции является устаревшим, и это не новая модернизация. Я надеюсь, что вы можете помочь.

JakeWharton говорит в некоторых вопросах, что мой json не является enl enoded form (слишком большой). Это значит, что я не могу отправить свой запрос на сервер с помощью Retrofit? Некоторые примеры json: http://www.jsoneditoronline.org/?id=661b2bae9eb520902825a58f8d44c338

ответ

0

У меня так много проблем с отправкой всего класса с формой-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()); 

Я надеюсь, что он будет работать, по крайней мере, Ф.О. r me.

Смежные вопросы