Ich habe es auf folgende Weise gemacht (der Inhaltstyp meines Anforderungsbodens war application/x-www-form-urlencoded):
Ich habe an den entsprechenden Stellen im Code Kommentare hinzugefügt.
/**
* @param url - Endpunkt-URL des Aufrufs
* @param requestBody - Ich empfange es als json, ohne irgendwelche Codierung von den entsprechenden Aktivitäten.
* @param listener - StringRequestListener ist ein Interface, das ich erstellt habe, um die Ergebnisse in den entsprechenden Aktivitäten zu bearbeiten
* @param activity - nur für den Kontext, überspringbar.
* @param header - Dies enthält meinen x-api-key
*/
public void makePostRequest2(String url, final JSONObject requestBody, final StringRequestListener listener,
Activity activity, final Map header) {
RequestQueue queue = VolleySingleton.getInstance().getRequestQueue();
/**
* Sie können diese Netzwerkprüfung überspringen.
*/
if(!NetworkTester.isNetworkAvailable()) {
Toast.makeText(MyApplication.getAppContext(),"Netzwerkfehler",Toast.LENGTH_SHORT).show();
return;
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener() {
@Override
public void onResponse(String response) {
listener.onResponse(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onError(error);
}
}) {
/**
* Das Setzen des Body-Content-Typs ist der wichtigste Teil.
* @return
* Sie müssen diese Methode nicht schreiben, wenn Ihr Body-Content-Typ application/x-www-form-urlencoded ist und die Codierung charset=UTF-8 ist
* Weil die Basismethode genau dasselbe tut.
*/
// @Override
// public String getBodyContentType() {
// return "application/x-www-form-urlencoded; charset=UTF-8";
// }
@Override
public Map getHeaders() throws AuthFailureError {
return header;
}
/**
* Ich habe den Stil dieser Methode aus der Originalmethode von com.Android.Volley.Request kopiert.
* @return
* @throws AuthFailureError
*/
@Override
public byte[] getBody() throws AuthFailureError {
Map params = new HashMap<>();
try {
params.put("grant_type","password");
params.put("username",requestBody.getString("username"));
params.put("password",requestBody.getString("password"));
} catch (JSONException e) {
e.printStackTrace();
}
//Ja, ich habe das von der Basismethode kopiert.
if (params != null && params.size() > 0) {
return encodeParameters(params, getParamsEncoding());
}
return null;
}
};
queue.add(stringRequest);
}
/**
* Diese Methode war privat in der com.Android.Volley.Request-Klasse. Ich musste sie hier kopieren, um meine Parameter zu codieren.
* @param params
* @param paramsEncoding
* @return
*/
private byte[] encodeParameters(Map params, String paramsEncoding) {
StringBuilder encodedParams = new StringBuilder();
try {
for (Map.Entry entry : params.entrySet()) {
encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
encodedParams.append('=');
encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
encodedParams.append('&');
}
return encodedParams.toString().getBytes(paramsEncoding);
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Codierung nicht unterstützt: " + paramsEncoding, uee);
}
}