【问题标题】:ANDROID Volley + Gson (POST)ANDROID Volley + Gson (POST)
【发布时间】:2016-07-25 17:39:43
【问题描述】:

你好。

我想使用 gson 发出一个 post 请求。

我把这个类实现到了 android 网站中...... http://developer.android.com/intl/pt-br/training/volley/request-custom.html

UserRequestHelper.userRequest(Request.Method.POST, EndpointURL.USUARIO, null, new Response.Listener<Usuario>() {
                    @Override
                    public void onResponse(Usuario response) {
                        Toast.makeText(getActivity(), "Cadastro realizado com sucesso!", Toast.LENGTH_SHORT).show();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getActivity(), "Erro ao realizar cadastro.", Toast.LENGTH_SHORT).show();
                    }
                });

我需要一个正文来发送用户?我如何发送对象用户进行发布请求?

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: android android-volley gson


    【解决方案1】:

    你必须重写 getBody :

        @Override
    public byte[] getBody() throws AuthFailureError {
        return gson.toJson(dataIn).getBytes();
    }
    

    整个示例类(形成相同的链接)编辑:

    public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Response.Listener<T> listener;
    private final Object dataIn;
    
    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
    public GsonRequest(String url, Object dataIn, Class<T> clazz, Map<String, String> headers,
                       Response.Listener<T> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.dataIn = dataIn;
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }
    
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }
    
    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }
    
    @Override
    public byte[] getBody() throws AuthFailureError {
        return gson.toJson(dataIn).getBytes();
    }
    
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    gson.fromJson(json, clazz),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
        }
    }
    

    【讨论】:

    • 比我只需要构建一个像 User user = new User(); 这样的对象。 user.setName("test");并将用户传递给 dataIn 变量?
    • 是的。如果您只想传递该类型,则可能需要将类型从 Object 更改为 User
    • 我可以将对象更改为用户类型...但是 clazz 的用途是什么?你能解释一下吗?
    • 它适用于您要接收的类型。查看链接中的教程了解更多信息
    • 我在尝试发出 GET 请求时遇到了这个问题...我需要为 GET 创建一个新的构造函数,并为 POST 和 PUT 保留这个 onoe? java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.lang.Object java.util.Map.put(java.lang.Object, java.lang.Object)”
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2015-08-10
    • 2016-08-12
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多