我正在尝试在Django Rest Framework中发送一个附加到Web服务的图像的数据库对象,在阅读一些出版物时,我发现我必须通过API服务中的多部分端点发送。但我没有找到正确的方法来做这件事。
我的服务端点是这样的:
@Multipart
@POST("api/sincro_establecimiento/")
Call<Establecimiento> sincroEstablecimiento(
@Header("Authorization") String token,
@Part MultipartBody.Part foto,
@Part("json") RequestBody establecimiento
);
这是模型类:
public class Establecimiento {
@SerializedName("id")
private Long id;
@SerializedName("nombre")
private String nombre;
@SerializedName("numero")
private String nro;
@SerializedName("posLatitud")
private String posLatitud;
@SerializedName("posLongitud")
private String posLongitud;
@SerializedName("foto")
private String foto;
@SerializedName("regimenTenencia")
private int regimenTenenciaId;
@SerializedName("regimenOtros")
private String regimenOtros;
public Establecimiento(Long id, String nombre, String nro, String posLatitud, String posLongitud, String foto, int regimenTenenciaId, String regimenOtros) {
this.id = id;
this.nombre = nombre;
this.nro = nro;
this.posLatitud = posLatitud;
this.posLongitud = posLongitud;
this.foto = foto;
this.regimenTenenciaId = regimenTenenciaId;
this.regimenOtros = regimenOtros;
}
public Establecimiento() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public String getNro() {
return nro;
}
public String getPosLatitud() {
return posLatitud;
}
public String getPosLongitud() {
return posLongitud;
}
public String getFoto() {
return foto;
}
public int getRegimenTenenciaId() {
return regimenTenenciaId;
}
public String getRegimenOtros() {
return regimenOtros;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setNro(String nro) {
this.nro = nro;
}
public void setPosLatitud(String posLatitud) {
this.posLatitud = posLatitud;
}
public void setPosLongitud(String posLongitud) {
this.posLongitud = posLongitud;
}
public void setFoto(String foto) {
this.foto = foto;
}
public void setRegimenTenenciaId(int regimenTenenciaId) {
this.regimenTenenciaId = regimenTenenciaId;
}
public void setRegimenOtros(String regimenOtros) {
this.regimenOtros = regimenOtros;
}
}
这是我的片段中调用服务的代码:
File foto = new File(element.getFoto());
final SharedPreferences prefs = getActivity().getApplication().getSharedPreferences("MDATUM_PREFS", Activity.MODE_PRIVATE);
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), foto);
MultipartBody.Part body = MultipartBody.Part.createFormData("foto",foto.getName(),reqFile);
String establecimientoJson = new Gson().toJson(element);
Log.i("JSON GENERADO",establecimientoJson);
RequestBody establecimientoBody = RequestBody.create(MediaType.parse("multipart/form-data"),establecimientoJson);
Call<Establecimiento> establecimientoCall = webDatumApi.sincroEstablecimiento("Token "+prefs.getString("PREF_USER_TOKEN",null),body,establecimientoBody);
establecimientoCall.enqueue(new Callback<Establecimiento>() {
@Override
public void onResponse(Call<Establecimiento> call, Response<Establecimiento> response) {
Log.i("SUCCESS","Operacion con exito");
}
@Override
public void onFailure(Call<Establecimiento> call, Throwable t) {
Log.i("FAILURE","Operacion fallida");
}
});
每当我调用该服务时,它都会返回一个错误,说明字段为nombre,而字段posLatitud是必需的,但它的字段在json中传递。
答案 0 :(得分:0)
我解决了这个问题,调试了webservice,请注意我收到的对象只包含两个元素,一个名为&#34; json&#34;另一个名为&#34; foto&#34;,所以我在服务终端中进行了以下修改:
@Multipart
@POST("api/sincro_establecimiento/")
Call<Establecimiento> sincroEstablecimiento(
@Header("Authorization") String token,
@Part MultipartBody.Part foto,
@Part("nombre") RequestBody nombre,
@Part("numero") RequestBody numero,
@Part("posLatitud") RequestBody posLatitud,
@Part("posLongitud") RequestBody posLongitud,
@Part("regimenTenencia") RequestBody regimenTenencia,
@Part("regimenOtros") RequestBody regimenOtros
);
我需要发送一个@Part每个字段,以及片段中的以下修改:
File foto = new File(element.getFoto());
final SharedPreferences prefs = getActivity().getApplication().getSharedPreferences("MDATUM_PREFS", Activity.MODE_PRIVATE);
RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), foto);
MultipartBody.Part body = MultipartBody.Part.createFormData("foto",foto.getName(),reqFile);
RequestBody nombre = RequestBody.create(MediaType.parse("text/plain"),element.getNombre());
RequestBody numero = RequestBody.create(MediaType.parse("text/plain"),element.getNro());
RequestBody posLatitud = RequestBody.create(MediaType.parse("text/plain"),element.getPosLatitud());
RequestBody posLongitud = RequestBody.create(MediaType.parse("text/plain"),element.getPosLongitud());
RequestBody regimenTenencia = RequestBody.create(MediaType.parse("text/plain"),Integer.toBinaryString(element.getRegimenTenenciaId()));
RequestBody regimenOtros = RequestBody.create(MediaType.parse("text/plain"),element.getRegimenOtros());
Call<Establecimiento> establecimientoCall = webDatumApi.sincroEstablecimiento("Token "+prefs.getString("PREF_USER_TOKEN",null),body,nombre,numero,posLatitud,posLongitud,regimenTenencia,regimenOtros);
establecimientoCall.enqueue(new Callback<Establecimiento>() {
@Override
public void onResponse(Call<Establecimiento> call, Response<Establecimiento> response) {
Log.i("SUCCESS","Operacion con exito");
}
@Override
public void onFailure(Call<Establecimiento> call, Throwable t) {
Log.i("FAILURE","Operacion fallida");
}
});