问题:
默认情况下改造使用GSON将HTTP主体转换为JSON和从JSON转换.使用@Body注释指定的对象将被传递给GSON进行序列化,其基本上将JAVA对象转换为JSON表示.这个JSON表示将是HTTP请求体.
JSONObject通过名称nameValuePairs将所有键值映射存储在成员变量中.
以下是JSONObject实现的摘录:
public class JSONObject {
...
private final Map nameValuePairs;
...
}
当您将JSONObject传递给@Body注释时,此JSONObject被排除,因此HTTP请求体包含:{“nameValuePairs”:“实际JSON对象”}.
解:
将实际的JAVA对象传递给@Body注释,而不是对应的JSONObject. GSON将负责将其转换为JSON表示.
例如
class HTTPRequestBody {
String key1 = "value1";
String key2 = "value2";
...
}
// GSON will serialize it as {"key1": "value1", "key2": "value2"},
// which will be become HTTP request body.
public interface MyService {
@Headers({"Content-type: application/json",
"Accept: */*"})
@POST("/test")
void postJson(@Body HTTPRequestBody body, Callback callback);
}
// Usage
MyService myService = restAdapter.create(MyService.class);
myService.postJson(new HTTPRequestBody(), callback);
替代方案:
如果您仍然想将原始JSON作为HTTP请求体发送,请按照Retrofit author here提到的解决方案.
其中一个建议的解决方案是使用TypedInput:
public interface MyService {
@POST("/test")
void postRawJson(@Body TypedInput body, Callback callback);
}
String json = jsonRequest.toString();
TypedInput in = new TypedByteArray("application/json", json.getBytes("UTF-8"));
myService.postRawJson(in, callback);