2017-01-30 3 views
0

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; 
} 

Antwort

0

Verwenden simplified coding Beispiel funktioniert es gut und leicht

+0

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