改造2 - 如何传递POST json对象

LMa*_*ker 6 android gson

所以,我有一个自定义对象列表,我需要一个像这样的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"
        }]
    }
}]}
Run Code Online (Sandbox Code Playgroud)

但我没有任何想法如何使用Gson做到这一点.我正在使用Retrofit 2并且需要将此JSON传递给正文请求.任何想法?

Sat*_* VG 9

是的,您需要将此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();
}
Run Code Online (Sandbox Code Playgroud)

Api通话活动:

将json对象传递给body请求使用@Body param.

在这里,您可以 使用该json请求格式在http://www.jsonschema2pojo.org/json到gson转换器中创建gson模型类.

之后用gson pojo类设置值并在改进时将json对象传递给body请求.

例如:

LoginModel:

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;
}
}
Run Code Online (Sandbox Code Playgroud)

使用pojo类设置值:

LoginModel model_obj = new LoginModel();
    mModel_obj.setUsername(mUsername);
    mModel_obj.setPassword(mPassword);
Run Code Online (Sandbox Code Playgroud)

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) {
    }
});
Run Code Online (Sandbox Code Playgroud)


LMa*_*ker 6

我看到了我一年前提出的这个问题,如今我正在使用另一种解决方案。如果仍然有人需要帮助并正在寻找帮助,请执行以下操作:

我已经制作了一个函数来处理所需的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();

}
Run Code Online (Sandbox Code Playgroud)

在我的API调用中,有以下一行:

     String json = new CustomGsonAdapter().serialize(surveysList, "surveys","survey");
    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
Run Code Online (Sandbox Code Playgroud)

RequestBody是诀窍。现在,只需将其传递RequestBody给改造电话即可。

@POST("surveys")
Call<Void> setSurveys(@Body RequestBody json);
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是解决问题的最佳方法,但对我而言确实如此。节省时间,避免创建仅发送给服务器的类。


Ank*_*hta 5

@POST("users/new")
Call<User> createUser(@Body User user);
Run Code Online (Sandbox Code Playgroud)

上面的代码将写在 Api 服务接口中。然后您可以通过将 JsonObject 作为 Body 传递来从 RestClient 类(通过 Retrofit 实例)调用它。