whats upAndroid Volley POST JSONObject mit int, string und jsonobjects
ich auf meinem Server JSONObject zu schreiben bin versucht.
Ich habe einige Codes versucht, die ich auf dem Stack gefunden:
String url = "http://10.0.2.2:8080/order";
try {
RequestQueue requestQueue = Volley.newRequestQueue(this);
String URL = "http://10.0.2.2:8080/order";
JSONObject jsonBody = new JSONObject();
jsonBody.put("waiterId", 1);
jsonBody.put("tableNumber", 4);
jsonBody.put("remark", "asd");
jsonBody.put("products", new JSONObject());
final String requestBody = jsonBody.toString();
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("VOLLEY", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.toString());
}
}) {
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return requestBody == null ? null : requestBody.getBytes("utf-8");
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
return null;
}
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String responseString = "";
if (response != null) {
responseString = String.valueOf(response.statusCode);
// can get more details such as response.headers
}
return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
}
};
requestQueue.add(stringRequest);
} catch (JSONException e) {
e.printStackTrace();
}
Ich erhalte Fehler:
E/Volley: [275] BasicNetwork.performRequest: Unexpected response code 400 for http://10.0.2.2:8080/order E/VOLLEY: com.android.volley.ServerError
Oder diese:
String url = "http://10.0.2.2:8080/order";
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("waiterId", 1);
jsonObject.put("tableNumber", 1);
jsonObject.put("remark", "zamowienie");
jsonObject.put("products", new JSONObject());
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest jsonObjReq = new JsonObjectRequest(
Request.Method.POST, url, jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// As of f605da3 the following should work
NetworkResponse response = error.networkResponse;
if (error instanceof ServerError && response != null) {
try {
String res = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, "utf-8"));
// Now you can use any deserializer to make sense of data
JSONObject obj = new JSONObject(res);
} catch (UnsupportedEncodingException e1) {
// Couldn't properly decode data to string
e1.printStackTrace();
} catch (JSONException e2) {
// returned data is not JSONObject?
e2.printStackTrace();
}
}
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
Singleton.getInstance(this).addToRequestQueue(jsonObjReq);
Fehler:
E/Volley: [275] BasicNetwork.performRequest: Unexpected response code 400 for http://10.0.2.2:8080/order
In der zweiten fand ich einen Tipp "Content-Type", aber nichts änderte sich.
Früher habe ich Objekte mit Postman, wie folgt aus:
{ "waiterId": 3, "tablenumber": 3, "Bemerkung": "orderRemark", "Produkte": [] }
Was ist das Problem? Vielleicht füge ich die "Produkte" schlecht hinzu. Wie fügt man mehrere 'Produkte' hinzu oder gibt json ohne 'Produkte' aus?
Danke!
EDIT: versuchte ich Änderung JSONObject zu JSONObject = new JSONObject ("{\" waiterId \ ": 3, \ "tablenumber \": 3, \ "Bemerkung \": \ "orderRemark \", \" Produkte \ ": []}") ;. Jetzt habe ich nicht Code 400 Problem. Es wird nur kein neues Element gepostet. Es zeigt keine Fehlermeldung: < (mit beiden Codes)
EDIT 2: Ich habe andere Methode ausprobiert. Es hat nicht so gut funktioniert.
class AsyncT extends AsyncTask<Void,Void,Void> {
@Override
protected Void doInBackground(Void... params) {
try {
Log.d("A","1");
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("waiterId", 1);
Log.d("A","2");
jsonObject.put("tableNumber", 1);
jsonObject.put("remark", "zamowienie");
jsonObject.put("products", new JSONObject());
} catch (JSONException e) {
e.printStackTrace();
}
URL url = new URL("http://10.0.2.2:8080/order");
URLConnection urlConn;
DataOutputStream printout;
DataInputStream input;
urlConn = url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestProperty("Content-Type","application/json");
urlConn.setRequestProperty("Host", "android.schoolportal.gr");
urlConn.connect();
printout = new DataOutputStream(urlConn.getOutputStream());
printout.writeBytes(URLEncoder.encode(jsonObject.toString(),"UTF-8"));
printout.flush();
printout.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Links zu externen Ressourcen gefördert werden, aber bitte Kontext rund um den Link hinzufügen, damit Ihre Kollegen Nutzer eine Vorstellung haben, was es ist und warum es da ist. Zitiere immer den relevantesten Teil eines wichtigen Links, falls die Zielseite nicht erreichbar ist oder permanent offline geschaltet wird. – Shashanth