改造 2 - 如何传递 POST json 对象
Posted
技术标签:
【中文标题】改造 2 - 如何传递 POST json 对象【英文标题】:retrofit 2 - how to pass a POST json object 【发布时间】:2021-08-20 16:49:25 【问题描述】:所以,我有一个我的自定义对象列表,我需要一个这样的 JSON:
"surveys": [
"survey":
"code": "05052017153632",
"date": "05/05/2017 15:36:32",
"device_id": 1,
"questions_attributes": [
"kind": "string",
"label": "Você encontrou tudo o que procurava?",
"value": "Infelizmente, não"
,
"kind": "string",
"label": "Em qual departamento você não encontrou o produto?",
"value": "FERRAMENTAS, TAPETES"
,
"kind": "string",
"label": "Deseja que a Havan entre em contato com você?",
"value": "Não informado"
,
"kind": "string",
"label": "Nome",
"value": "Não informado"
,
"kind": "string",
"label": "E-mail",
"value": "Não informado"
,
"kind": "string",
"label": "Telefone",
"value": "Não informado"
]
]
但我不知道如何使用 Gson。 我正在使用 Retrofit 2,需要将此 JSON 传递到正文请求中。 有什么想法吗?
【问题讨论】:
见Retrofit 2 — Constant, Default and Logic Values for POST and PUT Requests教程 @FarshidABZ 我需要帮助来解析这种格式的 tojson,我知道如何传递给 WS 问题是 Gson.toJson 冻结了我的 UI 在工作线程上执行此操作,以便 ui 可以继续运行 【参考方案1】:是的,您需要将此 JSON 传递到正文请求中。
改造界面:
public interface RetrofitInterface<R extends RetrofitClass>
@Headers("Content-Type: application/json", "Cache-Control: max-age=640000")
@POST("v1/auth/")
public Call<ResponseBody> callLogin(@Query("key") String key, @Body LoginModel body);
@Headers("Content-Type: application/json", "Cache-Control: max-age=640000")
public static final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppConstants.mBaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
API 调用活动:
使用 @Body 参数将 json 对象传递到正文请求中。
这里可以在http://www.jsonschema2pojo.org/创建gson模型类 使用该 json 请求格式将 json 转换为 gson。
之后,使用该 gson pojo 类设置值并将 json 对象传递给改造中的正文请求。
例如:
登录模型:
public class LoginModel
@SerializedName("username")
private String username;
@SerializedName("password")
private String password;
public String getUsername()
return username;
public void setUsername(String username)
this.username = username;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
用 pojo 类设置值:
LoginModel model_obj = new LoginModel();
mModel_obj.setUsername(mUsername);
mModel_obj.setPassword(mPassword);
API 调用:
Call<ResponseBody> call = service.callLogin(AppConstants.mApiKey, model_obj);
call.enqueue(new Callback<ResponseBody>()
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response)
@Override
public void onFailure(Call<ResponseBody> call, Throwable t)
);
【讨论】:
【参考方案2】:我看到了我 1 年前提出的这个问题,现在我正在使用另一种解决方案。如果有人仍然需要帮助并正在寻找这个,我们开始吧:
我已经制作了一个函数来处理我想要的 JSON 格式:
public String serialize(List<Object> objects, String arrKey, String
objKey)
JsonArray ja = new JsonArray();
for (Object object: objects)
Gson gson = new Gson();
JsonElement je = gson.toJsonTree(object);
JsonObject jo = new JsonObject();
jo.add(objKey, je);
ja.add(jo);
JsonObject objMain = new JsonObject();
objMain.add(arrKey,ja);
return objMain.toString();
在我的 API 调用中,我有这一行:
String json = new CustomGsonAdapter().serialize(surveysList, "surveys","survey");
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
RequestBody
是诀窍。现在,只需将这个RequestBody
传递给改造电话就可以了。
@POST("surveys")
Call<Void> setSurveys(@Body RequestBody json);
我不知道这是否是解决问题的最佳方式,但对我来说确实如此。 节省时间,避免创建一个类只是为了发送到服务器。
【讨论】:
【参考方案3】:@POST("users/new")
Call<User> createUser(@Body User user);
以上代码将使用 Api 服务接口编写。 然后你可以通过将 JsonObject 作为 Body 从 RestClient 类(通过 Retrofit 实例)调用它。
【讨论】:
以上是关于改造 2 - 如何传递 POST json 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用android studio中的改造服务在请求中传递json
改造 2 POST JSON 对象,响应给出错误代码 400,消息 = nul