【问题标题】:GsonRequest with POST带有 POST 的 GsonRequest
【发布时间】:2014-09-03 21:24:53
【问题描述】:

这是我目前正在使用的代码:

/**
 * Volley adapter for JSON requests that will be parsed into Java objects by Gson.
 */
public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new GsonBuilder()
            .registerTypeAdapter(ClusterUnits.class, new ClusterUnitsDeserializer()).create();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Listener<T> listener;
    private JSONObject parameters = null;

    /**
     * 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(int method, String url, Class<T> clazz, Map<String, String> headers,
            Listener<T> listener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }

    public GsonRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
                       Listener<T> listener, ErrorListener errorListener, JSONObject parameters) {
        this(method, url, clazz, headers, listener, errorListener);
        this.parameters = parameters;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> result = new HashMap<String, String>();
        try {
            result = new ObjectMapper().readValue(
                    parameters.toString(), TypeFactory.defaultInstance().constructMapLikeType(HashMap.class, String.class, String.class));
        } catch (IOException e) {
            DLog.d(e);
        }
        Log.i("PARAMETERS_LENGTH", String.valueOf(result.size()));
        return result;
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data, HttpHeaderParser.parseCharset(response.headers));
            Log.i("RESPONSE", json);
            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));
        }
    }
}

发布数据是否正确?我用来执行 HTTP 请求并使用 GSON 自动解码 JSON。我继续收到错误,因为发布的参数不正确:(

【问题讨论】:

  • I continue to get errors 你不认为这会有助于更具体一点吗?
  • 抱歉,它们是服务器错误,比如正文丢失,而是作为 urlenencode 传递

标签: android json gson android-volley


【解决方案1】:

你必须扩展 JsonRequest。这是我的 GsonRequest 实现

public class GsonRequest<T> extends JsonRequest<T> {

private final Gson mGson;
private final Class<T> mClassType;
private final Map<String, String> mHeaders;
private final Response.Listener<T> mListener;

public GsonRequest(int method, String url, Class<T> classType, JSONObject jsonRequest,
                   Response.Listener<T> listener, Response.ErrorListener errorListener) {
    this(method, url, classType, null, jsonRequest, listener, errorListener);
}

public GsonRequest(int method, String url, Class<T> classType, Map<String, String> headers,
                   JSONObject jsonRequest, Response.Listener<T> listener,
                   Response.ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
            errorListener);
    mGson = new Gson();
    mClassType = classType;
    mHeaders = headers;
    mListener = listener;
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    return mHeaders != null ? mHeaders : super.getHeaders();
}

@Override
protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
    try {
        String json = new String(networkResponse.data, HttpHeaderParser.parseCharset
                (networkResponse.headers));
        return Response.success(mGson.fromJson(json, mClassType),
                HttpHeaderParser.parseCacheHeaders(networkResponse));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
}

@Override
protected void deliverResponse(T response) {
    mListener.onResponse(response);
}
}

【讨论】:

  • 这个对我来说比较简单。
  • 你将如何使用这个类来发布带有 gson 的 json?
  • 在int方法下传什么?
【解决方案2】:

我已经用下面的代码解决了这个问题,即实现了getBody并改变了getBodyContentType:

    /**
     * Volley adapter for JSON requests that will be parsed into Java objects by Gson.
     */
    public class GsonRequest<T> extends Request<T> {
        private final Gson gson = new GsonBuilder()
                .registerTypeAdapter(ClusterUnits.class, new ClusterUnitsDeserializer()).create();
        private final Class<T> clazz;
        private final Map<String, String> headers;
        private final Listener<T> listener;
        private JSONObject parameters = null;

        /**
         * 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(int method, String url, Class<T> clazz, Map<String, String> headers,
                Listener<T> listener, ErrorListener errorListener) {
            super(method, url, errorListener);
            this.clazz = clazz;
            this.headers = headers;
            this.listener = listener;
        }

        public GsonRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
                           Listener<T> listener, ErrorListener errorListener, JSONObject parameters) {
            this(method, url, clazz, headers, listener, errorListener);
            this.parameters = parameters;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return headers != null ? headers : super.getHeaders();
        }

        @Override
        public String getBodyContentType() {
            return "application/json";
        }

        @Override
        public byte[] getBody() throws AuthFailureError {
            try {
                return parameters.toString().getBytes(getParamsEncoding());
            } catch (UnsupportedEncodingException e) {
                DLog.d(e);
            }
            return null;
        }

        @Override
        protected void deliverResponse(T response) {
            listener.onResponse(response);
        }

        @Override
        protected Response<T> parseNetworkResponse(NetworkResponse response) {
            try {
                String json = new String(
                        response.data, HttpHeaderParser.parseCharset(response.headers));
                Log.i("RESPONSE", json);
                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));
            }
        }
    }

【讨论】:

  • 你好,你传递什么作为 JSONObject 参数?这些是来自受保护的 Map getParams(){ Map params = new HashMap(); params.put("来自", "澳大利亚"); params.put("to", "法国");返回参数; }
猜你喜欢
  • 2017-09-23
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2017-12-08
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多