«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как сделать рабочие пост -просьбы с помощью Multipart с залпом в Android?

Как сделать рабочие пост -просьбы с помощью Multipart с залпом в Android?

Опубликовано в 2025-02-06
Просматривать:994

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

Рабочий пост -запрос Multipart с Volley с использованием последнего API

в разработке Android, отправка многочисленных запросов, таких как загрузка файлов и текстовые данные, есть общая задача. В то время как httpentity больше не доступна в новых версиях API, все еще существуют способы получения многопоточных запросов с использованием Volley.

создание основного многоупомянутого запроса

для создания Multipart Request , мы можем расширить класс запросов Volley, как SO:

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);
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();
; BytearrayOutputStream Bos = new BytearRayOutputStream (); DataOutputStream dos = new DataOutputStream (BOS); пытаться { // текстовые данные BuildTextPart (DOS, «Имя», «Джон Доу»); BuildTextPart (dos, "Email", "[email protected]"); // данные изображения Bitmap imagebitmap = bitmapfactory.decoderesource (context.getresources (), r.drawable.my_image); BuildImagePart (DOS, «Image», ImageBitmap); } catch (ioException e) { e.printstacktrace (); } multipartbody = bos.tobytearray ();

, включая корпус, в запросе

, как только корпус многопорядка построен, мы можем включить его в наш Multipartrteaste, как ::
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
            }
        });
MultipartRtequest Queck = new MultipartRequest ( "my_url", NULL, // заголовки "Multipart/Form-Data", Multipartbody, new response.listener () { @Override public void onResponse (ответ сетевой ответ) { // Обработка ответа } }, новый ответ.errorlistener () { @Override public void onerrorResponse (volleyerror error) { // Ошибка обработки } });

Добавление текстовых данных в запрос

В дополнение к данным изображения, вы также можете включить текстовые данные в свой запрос:
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
            }
        });
private void buildTextPart (DataOutputStream DataOutputStream, String name, строка значения) Throws IOException { DataOutputStream.WriteBytes (двагифенский граничный линий); DATEOUTPUTSTREAM.WRITEBYTES ("Disposition: Form-Data; name = \" "name" \ "" lineend); DataOutputStream.WriteBytes (Lineend); DataOutputStream.WriteBytes (значение); DataOutputStream.WriteBytes (Lineend); }

заменить двагифен, границу и lineend с соответствующими значениями из вашего кода.

Полный код образец

следующий пример кода показывает полный модульный реализация класса VolleyMultiparTrequest:
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
            }
        });
импорт com.android.volley.authfailureError; Импорт com.android.volley.networkresponse; Импорт com.android.volley.parseerror; импорт com.android.volley.request; импорт com.android.volley.response; Импорт com.android.volley.volleyerror; Import com.android.volley.toolbox.httpheaderparser; импортировать java.io.bytearrayoutputstream; импортировать java.io.dataoutputstream; импортировать java.io.ioexception; импортировать java.util.hashmap; импортировать java.util.map; Public Class VolleyMultiPartRequest Extends Request { Private Final Response.listener mlistener; Частный окончательный ответ.errorlistener merrorlistener; Приватная финальная карта mheaders; частная финальная строка MmimeType; Частный финальный байт [] mmultipartbody; public volleymultipartrequest (int method, string url, response.listener прослушиватель, Response.errorlistener errorListener) { Super (Method, URL, errorListener); this.mlistener = слушатель; this.merrorlistener = errorListener; this.mheaders = null; this.mmimetype = null; this.mmultipartbody = null; } public volleymultipartRequest (String URL, карта заголовки, строка MimeType, Byte [] Multipartbody, Response.listener прослушивание, response.errorlistener errorListener) { Super (method.post, url, errorListener); this.mlistener = слушатель; this.merrorlistener = errorListener; this.mheaders = заголовки; this.mmimeType = mimeType; this.mmultipartbody = multipartbody; } @Override Общественная карта getheaders () throws AuthfailureError { возврат (mheaders! = null)? mheaders: super.getheaders (); } @Override public String getBodyContentType () { вернуть ммиметип; } @Override public byte [] getbody () бросает authfailureerror { вернуть Mmultipartbody; } @Override Защищенный ответ parsenetworkresponse (networkresponse response) { пытаться { return response.success ( ответ, Httphaderparser.parsecacheheaders (ответ)); } catch (Exception e) { return response.error (новый Parseerror (e)); } } @Override Защищенная void deliveryresponse (networkresponse response) { mlistener.onresponse (ответ); } @Override public void DeliveError (ошибка Volleyerror) { merrorlistener.onerrorresponse (ошибка); } Public Static Map CreateMultIparTrequestParts (map params, map data) { Map multiparparams = new Hashmap (); for (map.Entry entry: params.EntrySet ()) { MultipartParams.put (entry.getKey (), new DataPart (entry.getValue ())); } for (map.Entry intry: data.EntrySet ()) { multiparparams.put (entry.getkey (), entry.getValue ()); } вернуть MultipartParams; } Public Static Byte [] createMultipartbody (map data, string groud) бросает ioException { BytearrayOutputStream Bos = new BytearRayOutputStream (); DataOutputStream dos = new DataOutputStream (BOS); for (map.Entry intry: data.EntrySet ()) { buildTextPart (dos, entry.getKey (), entry.getValue (). getContentType (), entry.getValue (). getFilEname (), entry.getValue (). getData ()); }

]

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3