如何将具有数据和图像的对象在改造中发送到DRF服务

时间:2017-11-30 14:54:32

标签: android django-rest-framework retrofit retrofit2

我正在尝试在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中传递。

1 个答案:

答案 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");
                }
            });