"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como fazer solicitações de multipartramento de pós -funcionários com voleio no Android?

Como fazer solicitações de multipartramento de pós -funcionários com voleio no Android?

Postado em 2025-02-06
Navegar:840

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

Postagem de funcionamento Solicitação multipart com voley usando a API mais recente

no desenvolvimento do Android, enviando solicitações de múltiplas, como o upload de arquivos e dados de texto, é uma tarefa comum. Embora o httpentity não esteja mais disponível em versões mais recentes da API, ainda existem maneiras de atingir solicitações multipartidas usando o voley. , podemos estender a classe de solicitação do voley como assim:

import com.android.volley.authfailureError; importação com.android.volley.networkResponse; importação com.android.volley.parseerror; importação com.android.volley.request; importação com.android.volley.Response; importação com.android.volley.volleyError; import com.android.volley.toolbox.httpheaderParser; importar java.util.map; classe multipartrequest estende a solicitação { // ouvinte para resposta de solicitação Resposta final privada.Listener MListener; // ouvinte para erro de solicitação Resposta final privada.errorListener MerrorListener; // Solicitar cabeçalhos mapa final privado Mheaders; // tipo de mímica multipart (por exemplo, "Multipart/form-dados; limite = xxx") String final privada mMimetype; // Solicite o corpo como multipart byte final privado [] mmultipartbody; // construtor public multipartreCest (URL da string, mapa cabeçalhos, mimetype de string, byte [] multipartbody, Response.Listener ouvinte, Response.errorListener ErrorListener) { Super (Method.Post, URL, ErrorListener); this.mListener = ouvinte; this.MerRorListener = ErrorListener; this.mHeaders = cabeçalhos; this.mmimeType = Mimetype; this.mmultipartbody = multipartbody; } // getters e setters // Substitua Getheaders () se você precisar adicionar cabeçalhos personalizados @Override mapa público getheaders () lança authfailureError { retornar (mheaders! = nulo)? Mheaders: Super.Getheaders (); } // Substituir getBodyContentType () para definir o tipo MIME correto para a solicitação de multipartimento @Override public String getBodyContentType () { retornar mmimetype; } // Substitua getbody () para retornar o corpo multipart @Override public byte [] getbody () lança authfailureError { retornar mmultipartbody; } // Substitua parsenetworkResponse () para analisar a resposta como uma resposta de rede @Override Resposta protegida parsenetworkResponse (resposta da rede de resposta) { tentar { REPORTIÇÃO DE REPORTIÇÃO.SUCESSO ( resposta, HttpheaderParser.ParSecacheHeaders (resposta)); } catch (Exceção e) { RETORNO RESPOSTO.Error (novo parseerror (e)); } } // entregando resposta e erro @Override Protect Void DeliveResponse (resposta NetworkResponse) { mlistener.onResponse (resposta); } @Override public void Deliverror (erro de voleleyerror) { MerrorListener.ONERRRRESPONSE (ERRO); } }

Construindo o corpo 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); tentar { // dados de texto BuildTextPart (DOS, "Nome", "John Doe"); BuildTextPart (DOS, "Email", "[email protected]"); // dados de imagem Bitmap imageBitmap = bitmapFactory.DecODeRESource (context.getResources (), r.Drawable.my_image); BuildImagePart (DOS, "Image", ImageBitmap); } catch (ioexception e) { E.PrintStackTrace (); } Multipartbody = bos.tobytearray ();

incluindo o corpo multipartido no pedido

:] "my_url", nulo, // cabeçalhos "Multipart/Form-Data", Multipartbody, new Response.Listener () { @Override public void onResponse (resposta NetworkResponse) { // manipula a resposta } }, new Response.errorListener () { @Override public void onErrResponse (erro de voleleyerror) { // manipula o erro } });
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();

Adicionando dados de texto ao request

Além dos dados da imagem, você também pode incluir dados de texto em sua solicitação:

privado void BuildTextPart (DataOutputStream DataOutputStream, Nome da String, String Value) lança IoException { DataOutputStream.WriteBytes (Linha de limite de dois hifes); DataOutputStream.WriteBytes ("Content-Disposition: Form-Data; nome = \" "Nome" \ "" Lineend); dataOutputStream.WriteBytes (LineEND); dataOutputStream.WriteBytes (valor); dataOutputStream.WriteBytes (LineEND); }
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();
Substitua dois hifes, limites e alinhamentos com os valores apropriados do seu código. implementação de uma classe volleymultiparTeCest:

import com.android.volley.authfailureError; importação com.android.volley.networkResponse; importação com.android.volley.parseerror; importação com.android.volley.request; importação com.android.volley.Response; importação com.android.volley.volleyError; import com.android.volley.toolbox.httpheaderParser; importar java.io.byteArrayOutputStream; importar java.io.dataOutputStream; importar java.io.ioException; importar java.util.hashmap; importar java.util.map; Classe pública volleymultiparTreCest estende a solicitação { Resposta final privada.Listener MListener; Resposta final privada.errorListener MerrorListener; mapa final privado Mheaders; String final privada mMimetype; byte final privado [] mmultipartbody; Public volleymultipartRequest (método int, String URL, Response.Listener ouvinte, Response.errorListener ErrorListener) { super (método, url, errorListener); this.mListener = ouvinte; this.MerRorListener = ErrorListener; this.mHeaders = null; this.mmimeType = null; this.mmultipartbody = null; } public volleymultipartReCest (URL da string, mapa cabeçalhos, mimetype de string, byte [] multipartbody, Response.Listener ouvinte, Response.errorListener ErrorListener) { Super (Method.Post, URL, ErrorListener); this.mListener = ouvinte; this.MerRorListener = ErrorListener; this.mHeaders = cabeçalhos; this.mmimeType = Mimetype; this.mmultipartbody = multipartbody; } @Override mapa público getheaders () lança authfailureError { retornar (mheaders! = nulo)? Mheaders: Super.Getheaders (); } @Override public String getBodyContentType () { retornar mmimetype; } @Override public byte [] getbody () lança authfailureError { retornar mmultipartbody; } @Override Resposta protegida parsenetworkResponse (resposta da rede de resposta) { tentar { REPORTIÇÃO DE REPORTIÇÃO.SUCESSO ( resposta, HttpheaderParser.ParSecacheHeaders (resposta)); } catch (Exceção e) { RETORNO RESPOSTO.Error (novo parseerror (e)); } } @Override Protect Void DeliveResponse (resposta NetworkResponse) { mlistener.onResponse (resposta); } @Override public void Deliverror (erro de voleleyerror) { MerrorListener.ONERRRRESPONSE (ERRO); } Public Static Map CreateMultiparTReCeStParts (map params, map data) { Mapa multipartParams = new hashmap (); para (map.entry entrada: params.entrySet ()) { MultipartParams.put (entrada.getKey (), new DataPart (Entry.getValue ())); } para (map.entry entrada: data.entryset ()) { MultipartParams.put (Entry.getKey (), Entry.getValue ()); } retornar multipartParams; } public static byte [] createMultipartbody (map dados, string limite) lança ioexception { ByteArrayOutputStream bos = new ByteArrayOutputStream (); DataOutputStream DOS = new DataOutputStream (BOS); para (map.entry entrada: data.entryset ()) { BuildTextPart (DOS, ENTRADE.GETKEY (), ENTRADE.GETVALUE (). GetContentType (), Entry.getValue (). getFileName (), Entry.getValue (). getData ()); }

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3