"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment faire des demandes de post-multipar en travail avec Volley dans Android?

Comment faire des demandes de post-multipar en travail avec Volley dans Android?

Publié le 2025-02-06
Parcourir:668

How to Make Working POST Multipart Requests with Volley in Android?

Publier la demande multipart avec volley en utilisant la dernière API

dans Android Development, envoyant des demandes de multipart, telles que le téléchargement de fichiers et de données texte, est une tâche commune. Bien que Httpentity ne soit plus disponible dans les versions API plus récentes, il existe encore des moyens d'atteindre les demandes en multipar , nous pouvons étendre la classe de demande de Volley comme ainsi:

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; importation java.util.map; Class MultipartReQuest étend la demande { // Écouteur de la demande de demande Private Final Response.Listener mListener; // Écouteur pour l'erreur de demande Réponse finale privée.ErrorListener MerrorListener; // demande des en-têtes Carte finale privée mheders; // Type de mime multipart (par exemple, "multipart / formulaire de forme; limite = xxx") chaîne finale privée mMiMetype; // Demande le corps en multipaction octet final privé [] mmultutrybody; // constructeur Public multipartReQuest (URL de chaîne, map En-têtes, chaîne mimeType, octet [] multipartBody, Response.Listener écouteur, réponse.ErrorListener ErrorListener) { super (méthode.post, url, errorListener); this.mListener = écouteur; this.merrorListener = errorListener; this.mheders = en-têtes; this.mMiMetype = mimeType; this.mmultupardbody = multipartbody; } // Getters et Setters // remplace les getheaders () si vous avez besoin d'ajouter des en-têtes personnalisés @Outrepasser MAP PUBLIC GetHeaders () lance AuthFailureError { return (mheaders! = null)? Mheheders: super.GetHeaders (); } // remplace getBodyContentType () pour définir le type de mime correct pour la demande en multiparte @Outrepasser String public getBodyContentType () { retour mMiMetype; } // remplacer getbody () pour renvoyer le corps multiparte @Outrepasser octet public [] getBody () lève AuthFailureError { retour mmultutrody; } // remplace ParseNetWorkResponse () pour analyser la réponse en tant que réseau de réseau @Outrepasser Réponse protégée PARSENETWORKRESPONSE (Réponse NetworkResponse) { essayer { Retour Response.success ( réponse, HttpheaderParser.ParsECacheHeaders (réponse)); } catch (exception e) { Retour Response.Error (Nouveau ParseError (E)); } } // Livraison de la réponse et de l'erreur @Outrepasser Protégé de livraison de void (Réponse NetworkResponse) { mListener.onresponse (réponse); } @Outrepasser VOID PUBLIQUE DIVELERROR (ERREUR VOLLEYERROR) { MerrorListener.onerrorResponse (erreur); } }

en construisant le corps multipart

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);
    }
}

byte [] multipartBody = new Byte [ 0]; BytearrayoutputStream bos = new bytearrayoutputStream (); DataOutputStream DOS = new DataOutputStream (BOS); essayer { // Données de texte buildTextPart (dos, "nom", "John Doe"); buildTextPart (dos, "email", "[email protected]"); // Données d'image Bitmap imagebitmap = bitmapfactory.decodeResource (context.getResources (), r.drawable.my_image); BuildImagePart (dos, "image", imagebitmap); } catch (ioexception e) { e.printStackTrace (); } multipartBody = bos.ToByTearray ();

y compris le corps multipart dans la demande

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();

MultipartReQuest request = new MultipartReQuest ( "my_url", en-têtes nuls, // "Multipart / Form-Data", Multipartbody, new Response.Listener () { @Outrepasser public void onResponse (Réponse de réponse réseau) { // gérer la réponse } }, nouvelle réponse.ErrorListener () { @Outrepasser public void onerrorResponse (VolleyError Error) { // gérer l'erreur } });

ajoutant des données de texte à la demande

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
            }
        });

privé void buildTextPart (dataOutputStream dataOutputStream, nom de chaîne, valeur de chaîne) lève ioException { DataOutputStream.WriteBytes (TwoHyphens Boundary Lineend); dataOutputStream.WriteBytes ("Content-Disposition: form-data; name = \" "name" \ "" lineend); dataOutputStream.WriteBytes (lineend); dataOutputStream.WriteBytes (valeur); dataOutputStream.WriteBytes (lineend); } Remplacez les deuxhyphens, la limite et la ligne avec des valeurs appropriées de votre code. Implémentation d'une classe VolleyMultipArtReQuest:

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; Importer java.io.ByteArrayOutputStream; import java.io.dataOutputStream; Importer java.io.ioException; import java.util.hashmap; importation java.util.map; classe publique VolleyMultipArtReQuest étend la demande { Private Final Response.Listener mListener; Réponse finale privée.ErrorListener MerrorListener; Carte finale privée mheders; chaîne finale privée mMiMetype; octet final privé [] mmultutrybody; Public VolemululTipArtReQuest (méthode int, URL de chaîne, réponse.Listener Réponse.ErrorListener ErrorListener) { super (méthode, url, errorListener); this.mListener = écouteur; this.merrorListener = errorListener; this.mheders = null; this.mMiMetype = null; this.mmultupardbody = null; } Public VolleyMultipArtReQuest (URL de chaîne, map En-têtes, String MIMETYPE, BYTE [] MultipartBody, Response.Listener écouteur, réponse.ErrorListener ErrorListener) { super (méthode.post, url, errorListener); this.mListener = écouteur; this.merrorListener = errorListener; this.mheders = en-têtes; this.mMiMetype = mimeType; this.mmultupardbody = multipartbody; } @Outrepasser MAP PUBLIC GetHeaders () lance AuthFailureError { return (mheaders! = null)? Mheheders: super.GetHeaders (); } @Outrepasser String public getBodyContentType () { retour mMiMetype; } @Outrepasser octet public [] getBody () lève AuthFailureError { retour mmultutrody; } @Outrepasser Réponse protégée PARSENETWORKRESPONSE (Réponse NetworkResponse) { essayer { Retour Response.success ( réponse, HttpheaderParser.ParsECacheHeaders (réponse)); } catch (exception e) { Retour Response.Error (Nouveau ParseError (E)); } } @Outrepasser Protégé de livraison de void (Réponse NetworkResponse) { mListener.onresponse (réponse); } @Outrepasser VOID PUBLIQUE DIVELERROR (ERREUR VOLLEYERROR) { MerrorListener.onerrorResponse (erreur); } Public Static Map CreateMultipArTreQuestParts (map Params, map data) { Map multipartParams = new hashmap (); pour (map.entry entrée: params.entryset ()) { multipartParams.put (entrée.getKey (), nouveau dataPart (entrée.GetValue ())); } pour (map.entry entrée: data.entryset ()) { multipartParams.put (entrée.getKey (), entry.getValue ()); } RETOUR MultipartParams; } octet statique publique [] CreateMultustrBody (map data, String Boundary) lève ioException { BytearrayoutputStream bos = new bytearrayoutputStream (); DataOutputStream DOS = new DataOutputStream (BOS); pour (map.entry entrée: data.entryset ()) { buildTextPart (dos, entrée.getKey (), entry.getValue (). getContentType (), entry.getValue (). getFileName (), entry.getValue (). GetData ()); }

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3