"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف تجعل طلبات العمل متعددة الأدوات مع Volley في Android؟

كيف تجعل طلبات العمل متعددة الأدوات مع Volley في Android؟

نشر في 2025-02-06
تصفح:141

How to Make Working POST Multipart Requests with Volley in Android?
مهمة مشتركة. على الرغم من أن httpentity لم يعد متاحًا في إصدارات API الأحدث ، لا تزال هناك طرق لتحقيق طلبات متعددة باستخدام Volley.

، يمكننا تمديد فئة طلب Volley مثل SO: استيراد com.android.volley.authfailureerror ؛ استيراد com.android.volley.networkresponse ؛ استيراد com.android.volley.parseerror ؛ استيراد com.android.volley.request ؛ استيراد com.android.volley.Response ؛ استيراد com.android.volley.volleyerror ؛ استيراد com.android.volley.toolbox.httpheaderparser ؛ استيراد java.util.map ؛ يمتد الفئة multirerequest طلب { // مستمع للرد على الطلب استجابة نهائية خاصة // مستمع لطلب خطأ استجابة نهائية خاصة. errorListener MerrorListener ؛ // طلب الرؤوس الخريطة النهائية الخاصة meaders ؛ // multipart mime type (على سبيل المثال ، "multipart/form-data ؛ الحدود = xxx") سلسلة نهائية خاصة mmimetype ؛ // اطلب الجسم كما هو متعدد البايت النهائي الخاص [] مموتبيبارتيد ؛ // مُنشئ Multipartrequest العامة (عنوان URL السلسلة ، خريطة ، وسلسلة mimetype ، byte [] multipartbody ، Response.Listener مستمع ، استجابة. Super (method.post ، url ، erriclistener) ؛ this.mlistener = المستمع ؛ this.merrorListener = خطأ فير ؛ this.mheaders = الرؤوس ؛ this.mmimetype = mimetype ؛ this.mmultipartbody = multipartbody ؛ } // getters و setters // override getheaders () إذا كنت بحاجة إلى إضافة رؤوس مخصصة @تجاوز الخريطة العامة getheaders () يلقي AuthFailureError { العودة (meaders! = فارغة)؟ Meaders: super.getheaders () ؛ } // override getBodyContentType () لتعيين نوع MIME الصحيح لطلب multipart @تجاوز السلسلة العامة getBodyContentType () { إرجاع mmimetype. } // override getBody () لإرجاع الجسم المتعدد @تجاوز البايت العام [] getBody () يلقي AuthFailureError { إرجاع mmultipartbody ؛ } // تجاوز parsenetworkresponse () لتحليل الاستجابة كإدارة networkResponse @تجاوز استجابة محمية parsenetworkResponse (NetworkResponse Response) { يحاول { إرجاع استجابة. إجابة، httpheaderparser.parsecachechheaders (استجابة)) ؛ } catch (استثناء e) { Return Response.error (New Parseerror (E)) ؛ } } // تقديم الاستجابة والخطأ @تجاوز void deliverresponse المحمي (استجابة NetworkResponse) { Mlistener.onresponse (استجابة) ؛ } @تجاوز public void delivererror (خطأ Volleyerror) { merrorListener.OnerRorSponse (خطأ) ؛ } }

بناء الجسم المتعدد

لبناء الجسم المتعدد ، يمكننا استخدام الخطوات التالية:

0] ؛ bytearrayoutputstream bos = جديد bytearrayoutputStream () ؛ DataOutputStream DOS = جديد DataOutputStream (BOS) ؛ يحاول { // بيانات النص BuildTextPart (DOS ، "Name" ، "John Doe") ؛ BuildTextPart (DOS ، "البريد الإلكتروني" ، "[email protected]") ؛ // بيانات الصورة bitmap imageBitMap = bitmapfactory.decoderesource (context.getResources () ، r.drawable.my_image) ؛ BuildImagePart (DOS ، "Image" ، ImageBitMap) ؛ } catch (ioException e) { E.PrintStackTrace () ؛ } multipartbody = bos.tobytearray () ؛

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

طلب multiredrequest = multiredrequest جديد ( "my_url" ، فارغة ، // الرؤوس "multipart/form-data" ، multipartbody ، new Response.Listener () { @تجاوز public void onResponse (NetworkResponse Response) { // الاستجابة } } ، استجابة جديدة. errorListener () { @تجاوز public void onerrorsponse (خطأ Volleyerror) { // خطأ الخطأ } }) ؛

إضافة بيانات نصية إلى الطلب

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

استبدل اثنين من الهفوين والحدود والخطية بقيم مناسبة من الكود الخاص بك. تنفيذ فئة فئة VolleymultiParTrequest:

استيراد com.android.volley.authfailureerror ؛ استيراد com.android.volley.networkresponse ؛ استيراد com.android.volley.parseerror ؛ استيراد com.android.volley.request ؛ استيراد com.android.volley.Response ؛ استيراد com.android.volley.volleyerror ؛ استيراد com.android.volley.toolbox.httpheaderparser ؛ استيراد java.io.bytearrayoutputstream ؛ استيراد java.io.dataOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ يمتد فئة الفئة العامة من فئة VolleyMultiParTrequest طلب { استجابة نهائية خاصة استجابة نهائية خاصة. errorListener MerrorListener ؛ الخريطة النهائية الخاصة meaders ؛ سلسلة نهائية خاصة mmimetype ؛ البايت النهائي الخاص [] مموتبيبارتيد ؛ VolleymultiParTrequest (طريقة int ، url string ، response.listener مستمع ، reponse.ErrorListener Errorlistener) { سوبر (الطريقة ، عنوان URL ، قائمة الأخطاء) ؛ this.mlistener = المستمع ؛ this.merrorListener = خطأ فير ؛ this.mheaders = null ؛ this.mmimetype = null ؛ this.mmultipartbody = null ؛ } VolleymultiParTrequest (url url سلسلة ، خريطة رؤوس ، string mimetype ، byte [] multipartbody ، Response.Listener مستمع ، استجابة. Super (method.post ، url ، erriclistener) ؛ this.mlistener = المستمع ؛ this.merrorListener = خطأ فير ؛ this.mheaders = الرؤوس ؛ this.mmimetype = mimetype ؛ this.mmultipartbody = multipartbody ؛ } @تجاوز الخريطة العامة getheaders () يلقي AuthFailureError { العودة (meaders! = فارغة)؟ Meaders: super.getheaders () ؛ } @تجاوز السلسلة العامة getBodyContentType () { إرجاع mmimetype. } @تجاوز البايت العام [] getBody () يلقي AuthFailureError { إرجاع mmultipartbody ؛ } @تجاوز استجابة محمية parsenetworkResponse (NetworkResponse Response) { يحاول { إرجاع استجابة. إجابة، httpheaderparser.parsecachechheaders (استجابة)) ؛ } catch (استثناء e) { Return Response.error (New Parseerror (E)) ؛ } } @تجاوز void deliverresponse المحمي (استجابة NetworkResponse) { Mlistener.onresponse (استجابة) ؛ } @تجاوز public void delivererror (خطأ Volleyerror) { merrorListener.OnerRorSponse (خطأ) ؛ } الخريطة الثابتة العامة createMultiParTrequestParts (خريطة params ، خريطة بيانات) { خريطة multipartparams = new hashmap () ؛ لـ (map.entry intern: params.entryset ()) { multipartparams.put (enter.getKey () ، dataPart جديد (intrad.getValue ())) ؛ } لـ (map.entry inter: data.entryset ()) { multipartparams.put (intpl.getKey () ، intrad.getValue ()) ؛ } إرجاع multipartparams. } البايت الثابت العام [] CreateMultipartBody (Map Data ، حدود السلسلة) يلقي ioException { bytearrayoutputstream bos = جديد bytearrayoutputStream () ؛ DataOutputStream DOS = جديد DataOutputStream (BOS) ؛ لـ (map.entry inter: data.entryset ()) { BuildTextPart (DOS ، Entry.getKey () ، intrad.getValue (). }

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3