Trabajo Post Solicitud de multipart con Volley usando API más recientes
en el desarrollo de Android, enviando solicitudes de múltiple, como cargar archivos y datos de texto, IS una tarea común. Si bien la httpEntity ya no está disponible en las versiones API más nuevas, todavía hay formas de lograr solicitudes de múltiples marcas usando volley.
creando una solicitud básica de multipart
para crear una solicitud multipart , podemos extender la clase de solicitud de Volley como así:
import com.android.volley.AuthFailureError; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.HttpHeaderParser; import java.util.Map; class MultipartRequest extends Request{ // Listener for request response private final Response.Listener mListener; // Listener for request error private final Response.ErrorListener mErrorListener; // Request headers private final Map mHeaders; // Multipart mime type (e.g., "multipart/form-data; boundary=XXX") private final String mMimeType; // Request body as multipart private final byte[] mMultipartBody; // Constructor public MultipartRequest(String url, Map headers, String mimeType, byte[] multipartBody, Response.Listener listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = headers; this.mMimeType = mimeType; this.mMultipartBody = multipartBody; } // Getters and setters // Override getHeaders() if you need to add custom headers @Override public Map getHeaders() throws AuthFailureError { return (mHeaders != null) ? mHeaders : super.getHeaders(); } // Override getBodyContentType() to set the correct mime type for the multipart request @Override public String getBodyContentType() { return mMimeType; } // Override getBody() to return the multipart body @Override public byte[] getBody() throws AuthFailureError { return mMultipartBody; } // Override parseNetworkResponse() to parse the response as a NetworkResponse @Override protected Response parseNetworkResponse(NetworkResponse response) { try { return Response.success( response, HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { return Response.error(new ParseError(e)); } } // Delivering response and error @Override protected void deliverResponse(NetworkResponse response) { mListener.onResponse(response); } @Override public void deliverError(VolleyError error) { mErrorListener.onErrorResponse(error); } }
construyendo el cuerpo multipart
para construir el cuerpo multipart, podemos usar los siguientes pasos:
byte[] multipartBody = new byte[0]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); try { // Text data buildTextPart(dos, "name", "John Doe"); buildTextPart(dos, "email", "[email protected]"); // Image data Bitmap imageBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_image); buildImagePart(dos, "image", imageBitmap); } catch (IOException e) { e.printStackTrace(); } multipartBody = bos.toByteArray();
incluyendo el cuerpo multipart en la solicitud
una vez que se construye el cuerpo multipart, podemos incluirlo en nuestra instancia multipartel como :
MultipartRequest request = new MultipartRequest( "my_url", null, // Headers "multipart/form-data", multipartBody, new Response.Listener() { @Override public void onResponse(NetworkResponse response) { // Handle response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Handle error } });
agregando datos de texto a la solicitud
Además de los datos de la imagen, también puede incluir datos de texto en su solicitud:
private void buildTextPart(DataOutputStream dataOutputStream, String name, String value) throws IOException { dataOutputStream.writeBytes(twoHyphens boundary lineEnd); dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" name "\"" lineEnd); dataOutputStream.writeBytes(lineEnd); dataOutputStream.writeBytes(value); dataOutputStream.writeBytes(lineEnd); }
reemplace twhyphens, límite y lineate con los valores apropiados de su código.
Complete Code Sample
La siguiente muestra muestra un modular completo de un modular completo Implementación de una clase VolleyMultIParTruCest:
import com.android.volley.AuthFailureError; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.HttpHeaderParser; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class VolleyMultipartRequest extends Request{ private final Response.Listener mListener; private final Response.ErrorListener mErrorListener; private final Map mHeaders; private final String mMimeType; private final byte[] mMultipartBody; public VolleyMultipartRequest(int method, String url, Response.Listener listener, Response.ErrorListener errorListener) { super(method, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = null; this.mMimeType = null; this.mMultipartBody = null; } public VolleyMultipartRequest(String url, Map headers, String mimeType, byte[] multipartBody, Response.Listener listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = headers; this.mMimeType = mimeType; this.mMultipartBody = multipartBody; } @Override public Map getHeaders() throws AuthFailureError { return (mHeaders != null) ? mHeaders : super.getHeaders(); } @Override public String getBodyContentType() { return mMimeType; } @Override public byte[] getBody() throws AuthFailureError { return mMultipartBody; } @Override protected Response parseNetworkResponse(NetworkResponse response) { try { return Response.success( response, HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(NetworkResponse response) { mListener.onResponse(response); } @Override public void deliverError(VolleyError error) { mErrorListener.onErrorResponse(error); } public static Map createMultipartRequestParts(Map params, Map data) { Map multipartParams = new HashMap(); for (Map.Entry entry : params.entrySet()) { multipartParams.put(entry.getKey(), new DataPart(entry.getValue())); } for (Map.Entry entry : data.entrySet()) { multipartParams.put(entry.getKey(), entry.getValue()); } return multipartParams; } public static byte[] createMultipartBody(Map data, String boundary) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); for (Map.Entry entry : data.entrySet()) { buildTextPart(dos, entry.getKey(), entry.getValue().getContentType(), entry.getValue().getFileName(), entry.getValue().getData()); }
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3