2016-07-29 11 views
0

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

1
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); 
+0

Perfekt - danke für die Hilfe. Ich wusste, dass es irgendwo eine elegante Lösung gegeben haben muss ... –

0

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); 
    } 
+0

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. –

+0

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 getParams() wirft AuthFailureError { Zuordnung params = new HashMap (); params.put ("Daten", json.toString()); Rückkehrparameter; } – ViramP