"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Android에서 Volley와 함께 Multipart 요청을 수행하는 방법은 무엇입니까?

Android에서 Volley와 함께 Multipart 요청을 수행하는 방법은 무엇입니까?

2025-02-06에 게시되었습니다
검색:705

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

mmultipartbody; // 생성자 public multipartrequest (문자열 URL, MAP 헤더, String Mimetype, Byte [] multipartbody, response.listener 리스너, 응답 .ErrorListener ErrorListener) { super (method.post, url, errorlistener); this.mlistener = 리스너; this.merrorlistener = ErrorListener; this.mheaders = 헤더; this.mmimeType = mimetype; this.mmultipartbody = multipartbody; } // getters and setters // 사용자 지정 헤더를 추가 해야하는 경우 getheaders () 오버라이드 @보수 public map getheaders ()가 authfailureerRor를 던지십시오 { return (mheaders! = null)? mheaders : super.getheaders (); } // getBodyContentType ()를 재정의하여 멀티 파트 요청에 대한 올바른 마임 유형을 설정합니다. @보수 공개 문자열 getBodyContentType () { mmimeType을 반환합니다. } // getbody ()를 무시하고 멀티 파트 본체를 반환합니다 @보수 public byte [] getbody ()는 authfailureerRor { mmultipartbody를 반환합니다. } // ParsenetWorkResponse ()를 재정의하여 응답을 네트워크 응답으로 구문 분석합니다. @보수 보호 된 응답 parsenetworkResponse (NetworkResponse 응답) { 노력하다 { return response.success ( 응답, httpheaderparser.parsecacheheaders (응답)); } catch (예외 e) { return response.error (new parseerror (e)); } } // 응답 및 오류 전달 @보수 보호 된 void DeliverResponse (NetworkResponse 응답) { mlistener.onresponse (응답); } @보수 public void delivererror (VolleyError 오류) { merrorlistener.onerrorresponse (오류); } }

multipart 바디 구축

multipart 본체를 구축하려면 다음 단계를 사용할 수 있습니다. 0]; BytearRayoutputStream BOS = New 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);
    }
}

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

:

multipartRequest 요청 = 새로운 multipartrequest ( "my_url", null, // 헤더 "Multipart/Form-Data", 멀티 파트, 새 응답 .listener () { @보수 public void onresponse (NetworkResponse 응답) { // 응답을 처리합니다 } }, 새로운 응답 .ErrorListener () { @보수 public void onerrorRepronse (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 private void buildTextPart (dataOutputStream DataOutputStream, 문자열 이름, 문자열 값) IoException { DataOutputStream.writeBytes (2hyphens 경계선); dataOutputStream.writeBytes ( "내용-드라이브 : form-data; name = \" "name"\ ""lineend); DataOutputStream.writeBytes (Lineend); DataOutputStream.writeBytes (값); DataOutputStream.writeBytes (Lineend); }

코드에서 적절한 값으로 TwoHyphens, 경계 및 라인 엔드를 교체하십시오. 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;

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);
    }
}
import com.android.volley.authfailureError; com.android.volley.networkResponse import; com.android.volley.parseerror import; import com.android.volley.request; com.android.volley.response import; com.android.volley.volleyerror import; com.android.volley.toolbox.httpheaderparser import; import java.io.BytearRayoutputStream; import java.io.dataOutputStream; import java.io.ioexception; java.util.hashmap import; java.util.map import; 공개 클래스 VolleymultipartRequest request { 개인 최종 응답 .listener mlistener; 개인 최종 응답 .Errorlistener Merrorlistener; 개인 최종지도 m 헤더; 개인 최종 문자열 mmimeType; 개인 최종 바이트 [] mmultipartbody; public volleymultipartrequest (int method, string url, response.listener Listener, 응답 .ERRORLISTERE ERRORLISTERE) { Super (메소드, URL, ErrorListener); this.mlistener = 리스너; this.merrorlistener = ErrorListener; this.mheaders = null; this.mmimeType = null; this.mmultipartbody = null; } public volleymultipartrequest (String URL, Map 헤더, String Mimetype, Byte [] multipartbody, response.listener 리스너, 응답 .ErrorListener ErrorListener) { super (method.post, url, errorlistener); this.mlistener = 리스너; this.merrorlistener = ErrorListener; this.mheaders = 헤더; this.mmimeType = mimetype; this.mmultipartbody = multipartbody; } @보수 public map getheaders ()가 authfailureerRor를 던지십시오 { return (mheaders! = null)? mheaders : super.getheaders (); } @보수 공개 문자열 getBodyContentType () { mmimeType을 반환합니다. } @보수 public byte [] getbody ()는 authfailureerRor { mmultipartbody를 반환합니다. } @보수 보호 된 응답 parsenetworkResponse (NetworkResponse 응답) { 노력하다 { return response.success ( 응답, httpheaderparser.parsecacheheaders (응답)); } catch (예외 e) { return response.error (new parseerror (e)); } } @보수 보호 된 void DeliverResponse (NetworkResponse 응답) { mlistener.onresponse (응답); } @보수 public void delivererror (VolleyError 오류) { merrorlistener.onerrorresponse (오류); } public static map createmultipartrequestparts (map params, map data) { Map 멀티 파트 파람 = New Hashmap (); for (map.entry entry : params.entryset ()) { MultipartParams.put (Entry.getKey (), New DataPart (Entry.GetValue ())); } for (map.entry 항목 : data.entryset ()) { MultipartParams.put (Entry.GetKey (), entry.getValue ()); } 리턴 다파트 파람; } public static byte [] createmultipartbody (map data, string boundary)는 ioexception { BytearRayoutputStream BOS = New ByTearRayoutputStream (); DataOutputStream dos = 새로운 DataOutputStream (BOS); for (map.entry 항목 : data.entryset ()) { buildTextPart (dos, entry.getKey (), entry.getValue (). getContentType (), enther.getValue (). getFileName (), enther.getValue (). getData ()); }

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3