Google Volley : Como enviar um pedido POST com dados JSON ?

? anthony @ | Original: StackOverFlow
---

Gostaria de enviar um novo pedido JsonObjectRequest :

I want to receive Json data (response from server):OK

Quero enviar Json dados formatados com este pedido para o servidor

JsonObjectRequest request =
        new JsonObjectRequest(
                Request.Method.POST,
                "myurl.com",
                null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                       //...
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                       //...
                    }
                })
                {
                    @Override
                    protected Map<String,String> getParams() {
                        // something to do here ??
                        return params;
                    }

                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError                    {
                        // something to do here ??
                        return params;
                    }
                };

Muito obrigado galera!

Ps: Eu uso Gson lib no meu projeto também.

---

Top 5 Responder

1shkschneider @

JsonObjectRequest actuallyaccepts JSONObject como corpo.

De http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/

final String url = "some/url";
final JSONObject jsonBody = /* ... */;

new JsonObjectRequest(url, jsonBody, new Response.Listener<JSONObject>() { ... });

Aqui está o código oficial do evento e javadoc ( param jsonRequest ):

/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
 *   indicates no parameters will be posted along with request.
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
        Listener<JSONObject> listener, ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                errorListener);
}

https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/JsonObjectRequest.java

2Manish Dubey @

Criar um objeto da classe RequestQueue .

RequestQueue queue = Volley.newRequestQueue(this);

Criar um StringRequest com a resposta e ouvinte erro.

 StringRequest sr = new StringRequest(Request.Method.POST,"http://api.someservice.com/post/comment", new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        mPostCommentResponse.requestCompleted();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mPostCommentResponse.requestEndedWithError(error);
    }
}){
    @Override
    protected Map<String,String> getParams(){
        Map<String,String> params = new HashMap<String, String>();
        params.put("user",userAccount.getUsername());
        params.put("pass",userAccount.getPassword());
        params.put("comment", Uri.encode(comment));
        params.put("comment_post_ID",String.valueOf(postId));
        params.put("blogId",String.valueOf(blogId));

        return params;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String,String> params = new HashMap<String, String>();
        params.put("Content-Type","application/x-www-form-urlencoded");
        return params;
    }
};

Adicionar o seu pedido para o RequestQueue .

queue.add(jsObjRequest);

Criar PostCommentResponseListener Interface apenas para que você possa vê-lo. É um delegado simples para a solicitação assíncrona .

public interface PostCommentResponseListener {
public void requestStarted();
public void requestCompleted();
public void requestEndedWithError(VolleyError error);
}

Incluir permissão INTERNET dentro AndroidManifest.xml arquivo.

<uses-permission android:name="android.permission.INTERNET"/>