我已经多次看到这个问题并尝试了很多解决方案但是没有解决我的问题,我正在尝试使用改造在POST请求中发送json,我不是编程专家所以我可能会错过一些明显的东西
我的JSON是一个字符串,看起来像这样:
{"id":1,"nom":"Hydrogène","slug":"hydrogene"}
我的界面(称为 APIService.java )看起来像这样:
@POST("{TableName}/{ID}/update/0.0")
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID);
我的 ClientServiceGenerator.java 看起来像这样:
public class ClientServiceGenerator{
private static OkHttpClient httpClient = new OkHttpClient();
public static <S> S createService(Class<S> serviceClass, String URL) {
Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.client(httpClient).build();
return retrofit.create(serviceClass);
}}
最后这是我活动中的代码
APIService client = ClientServiceGenerator.createService(APIService.class, "http://mysiteexample.com/api.php/");
Call<String> call = client.cl_updateData("atomes", "1");
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
if (response.code() == 200 && response.body() != null){
Log.e("sd", "OK");
}else{
Log.e("Err", response.message()+" : "+response.raw().toString());
}
}
@Override
public void onFailure(Throwable t) {
AlertDialog alertError = QuickToolsBox.simpleAlert(EditDataActivity.this, "updateFail", t.getMessage(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertError.show();
}
});
告诉我你是否需要其他任何东西,希望有人能帮助我。
修改 没有第一次提到它,但我的JSON并不总是使用相同的键(id,nom,slug)。
答案 0 :(得分:12)
首先,您需要创建一个对象来表示您需要的json:
public class Data {
int id;
String nom;
String slug;
public Data(int id, String nom, String slug) {
this.id = id;
this.nom = nom;
this.slug = slug;
}
}
然后,修改您的服务以便能够发送此对象:
@POST("{TableName}/{ID}/update/0.0")
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID, @Body Data data);
最后,传递这个对象:
Call<String> call = client.cl_updateData("atomes", "1", new Data(1, "Hydrogène", "hydrogene"));
<强> UPD 强>
为了能够发送任何数据,请使用Object
代替Data
:
@POST("{TableName}/{ID}/update/0.0")
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID,
@Body Object data);