Volley-POST-request, 400-Fehler
Dies ist das erste mal, dass ich mich die Arbeit mit JSON, aber ich experimentiere mit POST-Anfragen.
Ich will eine POST-Anfrage an diese website http://jsonblob.com/api
Mein code funktioniert, wenn ich einen asynctask + httppost
private static final String url = "http://jsonblob.com/api/jsonBlob";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new PostJsonTask().execute();
}
private class PostJsonTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
HttpResponse response = post();
Header s = response.getFirstHeader("Location");
Log.d("PostJsonTask", s.getValue());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private HttpResponse post() throws Exception {
//convert parameters into JSON object
Map<String, String> params = new HashMap<String, String>();
params.put("user", "Robby");
params.put("pass", "zqdqzdqdqzd");
JSONObject holder = new JSONObject(params);
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
StringEntity se = new StringEntity(holder.toString());
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setHeader("Accept", "application/json");
post.setHeader("Content-type", "application/json");
post.setEntity(se);
return client.execute(post);
}
}
Mit diesem code kann ich erfolgreich den Standort parameter.
Aber ich möchte das mit dem Volley-Bibliothek, ich habe bereits den folgenden code :
private static final String url = "http://jsonblob.com/api/jsonBlob";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RequestQueue queue = Volley.newRequestQueue(this);
StringRequest request = new StringRequest(Request.Method.POST, url, createResponseListener(), createErrorListener()) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Accept", "application/json");
headers.put("Content-type", "application/json");
return headers;
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("user", "Robby");
params.put("pass", "zqdqzdqdqzd");
return params;
}
@Override
protected Response<String> parseNetworkResponse(
NetworkResponse response) {
Map<String, String> headers = response.headers;
String location = headers.get("Location");
Log.d("PostJsonTask", location);
return super.parseNetworkResponse(response);
}
};
queue.add(request);
}
private ErrorListener createErrorListener() {
return new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
};
}
private Listener<String> createResponseListener() {
return new Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("PostJsonTask", response);
}
};
}
Aber das gibt eine VolleyError mit code 400. Wie kann ich dieses Problem beheben?
- Und VolleyError 400 bedeutet?
- Verwenden Sie createResponseListener() als parameter in new StringRequest (), wo createResponseListener ausreichen würde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt, die versuchen, Content-type-header setzen für bodyContentType und in postman(web -) auch Sie den content-Typ der Körper nur
Nicht die
getParams
überschreiben.Stattdessen erstellen Sie eine JSON mit diesen parameter und stellen den Hauptteil der Anforderung, wie Sie in
JsonObjectRequest
(oder einfach einJsonObjectRequest
statt einerStringRequest
), z.B.