我无法找到有关此主题的正确信息。问题已经提到,但没有正确的解决方案。请求没问题,如:
@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答案 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());
我希望它能起作用,至少对我而言。