Volley ist eine beliebte Android-Bibliothek zum Stellen von HTTP-Anfragen. In früheren API-Versionen wurde HttpEntity in Verbindung mit Volley für die Übermittlung mehrteiliger Formulardaten verwendet. Mit der Abschaffung von HttpEntity in API 22 und seiner vollständigen Entfernung in API 23 stehen Entwickler jedoch vor einer Herausforderung.
In diesem Artikel zeigen wir eine funktionierende Lösung für die Durchführung mehrteiliger POST-Anfragen ohne die Verwendung von HttpEntity. Mit dem bereitgestellten Code können Sie mehrere Dateien zusammen mit Textdaten hochladen.
Die hier vorgestellte Implementierung besteht aus zwei Klassen: MultipartActivity und MultipartRequest. MultipartActivity übernimmt die Vorbereitung mehrteiliger Formulardaten, während MultipartRequest die Request-Klasse von Volley erweitert und die erforderlichen Methoden überschreibt, um den mehrteiligen Text zu verarbeiten und die Serverantwort zu verarbeiten.
Um diese Lösung zu verwenden, befolgen Sie diese Schritte :
MultipartActivity.java:
import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.widget.Toast; import com.android.volley.NetworkResponse; import com.android.volley.Response; import com.android.volley.VolleyError; import com.example.multipartvolley.MultipartRequest; import com.example.multipartvolley.VolleySingleton; import java.util.HashMap; import java.util.Map; public class MultipartActivity extends Activity { private Context context = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Assuming you have prepared file data in fileData1 and fileData2 String url = "http://192.168.1.100/api/postfile"; MultipartRequest multipartRequest = new MultipartRequest(url, null, "multipart/form-data", multipartBody, new Response.Listener<NetworkResponse>() { @Override public void onResponse(NetworkResponse response) { Toast.makeText(context, "Upload successfully!", Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(context, "Upload failed!\r\n" + error.toString(), Toast.LENGTH_SHORT).show(); } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<>(); params.put("text_field1", "Value for text field 1"); params.put("text_field2", "Value for text field 2"); return params; } @Override protected Map<String, DataPart> getByteData() { Map<String, DataPart> params = new HashMap<>(); params.put("file_name1", new DataPart("file_name1.txt", "file content 1".getBytes(), "text/plain")); params.put("file_name2", new DataPart("file_name2.png", fileData1, "image/png")); return params; } }; VolleySingleton.getInstance(context).addToRequestQueue(multipartRequest); } }
MultipartRequest.java:
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.HashMap; import java.util.Map; class MultipartRequest extends Request<NetworkResponse> { private final Response.Listener<NetworkResponse> mListener; private final Response.ErrorListener mErrorListener; private Map<String, String> mHeaders; private Map<String, DataPart> mByteData; MultipartRequest(String url, Map<String, String> headers, String contentType, Map<String, DataPart> byteData, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = headers; this.mByteData = byteData; } @Override public Map<String, String> getHeaders() throws AuthFailureError { return mHeaders != null ? mHeaders : super.getHeaders(); } @Override public String getBodyContentType() { return "multipart/form-data; boundary=" + getBoundary(); } @Override public byte[] getBody() throws AuthFailureError { return encodeMultipartData(mByteData, getBoundary()); } private String getBoundary() { return Long.toHexString(System.currentTimeMillis()); } @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); } protected static byte[] encodeMultipartData(Map<String, DataPart> dataParts, String boundary) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); try { for (Map.Entry<String, DataPart> entry : dataParts.entrySet()) { dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + "; filename=\"" + entry.getValue().getFileName() + "\"" + lineEnd); dos.writeBytes(String.format("Content-Type: %s%s", entry.getValue().getType(), lineEnd)); dos.writeBytes(lineEnd); dos.write(entry.getValue().getContent()); dos.writeBytes(lineEnd); } dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); return bos.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } } class DataPart { private String fileName; private byte[] content; private String type; DataPart(String fileName, byte[] content, String type) { this.fileName = fileName; this.content = content; this.type = type; } String getFileName() { return fileName; } byte[] getContent() { return content; } String getType() { return type; } } }
Dieser Code verarbeitet mehrteilige Formulare Datenanfragen, bei denen Sie sowohl Datei- als auch Textparameter sicher an den Server übergeben können. Es ist wichtig zu beachten, dass der endgültige Code nicht für den Produktionsgebrauch bestimmt ist und entsprechend Ihren spezifischen Anforderungen geändert werden sollte.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Volley mehrteilige POST-Anfragen stellen, ohne HttpEntity zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!