Ich möchte eine Server-POST-Anfrage machen, eine JSON-Payload senden und eine String-Antwort erhalten. Ich habe überall nachgesehen und es scheint keine einfache Möglichkeit zu sein, dies mit der Volley-Bibliothek zu tun, ohne eine benutzerdefinierte Anfrage zu implementieren (die ich komplett verloren habe, als ich versuchte, sie zu implementieren). Was ist der richtige Weg, um diese POST-Anfrage durchzuführen?Hat Volley JSON-Argument, native Unterstützung für String-Antwort
Antwort
final JSONObject body = new JSONObject();
try {
// Todo: populate JSON body
} catch (JSONException e) {
e.printStackTrace();
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://...",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
) {
@Override
public byte[] getBody() throws AuthFailureError {
return body.toString().getBytes();
}
@Override
public String getBodyContentType() {
return "application/json";
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
Volley haben JsonObjectRequest und JsonArrayRequest.
/**
* Making json object request
* */
public void makeJsonObjReq(String url) {
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
url,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
// msgResponse.setText(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
}) {
/**
* Passing some request headers
* */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
return headers;
}
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "[email protected]");
return params;
}
};
// Adding request to request queue
ApplicationController.getInstance().addToRequestQueue(jsonObjReq,
tag_json_obj);
// Cancelling request
// ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_obj);
}
/**
* Making json array request
* */
public void makeJsonArryReq(String url, final int _type) {
JsonArrayRequest req = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
apiTaskListener.onTaskComplete("error",_type);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
apiTaskListener.onTaskComplete("error",_type);
}
});
// Adding request to request queue
ApplicationController.getInstance().addToRequestQueue(req,
tag_json_arry);
// Cancelling request
// ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_arry);
}
Absolut, aber ich will nicht zu ‚abrufen‘ ein JSON-Objekts, ich will ‚post‘ ein JSON-Objekt, und im Gegenzug wird der Server mir eine Antwort senden, wie interpretiert werden ein Faden. Ich bin derjenige mit dem JSONObject, mit dem der Server eine Zeichenfolge hat, und wir tauschen ihn aus. –
Sie können verwenden StringRequest strReq = new StringRequest weil json nichts anderes als ein Format von Zeichenfolge. so können Sie Ihre JSON als Zeichenfolge senden. geschützte Karte
Perfekt - danke für die Hilfe. Ich wusste, dass es irgendwo eine elegante Lösung gegeben haben muss ... –