최신 API를 사용하여 Volley로 POST 멀티파트 요청 작업
Android 개발에서 파일 및 텍스트 데이터 업로드와 같은 멀티파트 요청을 보내는 것은 일반적인 작업. 최신 API 버전에서는 HttpEntity를 더 이상 사용할 수 없지만 Volley를 사용하여 멀티파트 요청을 수행할 수 있는 방법은 여전히 있습니다.
기본 멀티파트 요청 생성
멀티파트 요청을 생성하려면 , 다음과 같이 Volley의 Request 클래스를 확장할 수 있습니다.
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<NetworkResponse> { // Listener for request response private final Response.Listener<NetworkResponse> mListener; // Listener for request error private final Response.ErrorListener mErrorListener; // Request headers private final Map<String, String> 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<String, String> headers, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> 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<String, String> 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<NetworkResponse> 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", "john.doe@email.com"); // 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 인스턴스에 포함할 수 있습니다. 그래서:
MultipartRequest request = new MultipartRequest( "my_url", null, // Headers "multipart/form-data", multipartBody, new Response.Listener<NetworkResponse>() { @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, String value) throws IOException { dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"" + lineEnd); dataOutputStream.writeBytes(lineEnd); dataOutputStream.writeBytes(value); dataOutputStream.writeBytes(lineEnd); }
두 개의 하이픈, 경계 및 lineEnd를 사용자의 적절한 값으로 바꾸세요. code.
전체 코드 샘플
다음 코드 샘플은 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.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class VolleyMultipartRequest extends Request<NetworkResponse> { private final Response.Listener<NetworkResponse> mListener; private final Response.ErrorListener mErrorListener; private final Map<String, String> mHeaders; private final String mMimeType; private final byte[] mMultipartBody; public VolleyMultipartRequest(int method, String url, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) { super(method, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = null; this.mMimeType = null; this.mMultipartBody = null; } public VolleyMultipartRequest(String url, Map<String, String> headers, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = headers; this.mMimeType = mimeType; this.mMultipartBody = multipartBody; } @Override public Map<String, String> getHeaders() throws AuthFailureError { return (mHeaders != null) ? mHeaders : super.getHeaders(); } @Override public String getBodyContentType() { return mMimeType; } @Override public byte[] getBody() throws AuthFailureError { return mMultipartBody; } @Override protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) { try { return Response.success( response, HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(NetworkResponse response) { mListener.onResponse(response); } @Override public void deliverError(VolleyError error) { mErrorListener.onErrorResponse(error); } public static Map<String, DataPart> createMultipartRequestParts(Map<String, String> params, Map<String, DataPart> data) { Map<String, DataPart> multipartParams = new HashMap<>(); for (Map.Entry<String, String> entry : params.entrySet()) { multipartParams.put(entry.getKey(), new DataPart(entry.getValue())); } for (Map.Entry<String, DataPart> entry : data.entrySet()) { multipartParams.put(entry.getKey(), entry.getValue()); } return multipartParams; } public static byte[] createMultipartBody(Map<String, DataPart> data, String boundary) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); for (Map.Entry<String, DataPart> entry : data.entrySet()) { buildTextPart(dos, entry.getKey(), entry.getValue().getContentType(), entry.getValue().getFileName(), entry.getValue().getData()); }
위 내용은 Android에서 Volley를 사용하여 POST 멀티파트 요청 작업을 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!