【问题标题】:Unexpected Response 400 and 500 in volley with gson post method使用 gson post 方法截击时的意外响应 400 和 500
【发布时间】:2015-12-20 18:11:03
【问题描述】:

我反复收到此意外响应代码 500 和 400。 请帮忙

GsonRequest 类

公共类 GsonRequest 扩展请求

{

私有 Gson mGson = new Gson();

私有类 clazz;

私有地图标头;

private Map<String, String> params;
private Listener<T> listener;
//String mRequestBody;
Map<String, String> mRequestBody;

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

/**
 * Make a POST 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
 */
public GsonRequest(int method,
                   String url,
                   Class<T> clazz,
                   Map<String, String> headers,
                   Map<String, String> requestBody,
                   //String requestBody,
                   Listener<T> listener,
                   ErrorListener errorListener) {

    super(method, url, errorListener);
    //this.mRequestBody = requestBody;
   this.params = requestBody;
    this.listener = listener;
    this.headers = headers;
    mGson = new Gson();
}

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

@Override
public String getBodyContentType() {
    return "application/x-www-form-urlencoded";
}


@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));
        return Response.success(
                mGson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
}

}

我的活动课

公共类 Act_GsonRequest 扩展 Activity { 私有TextView mTvResult;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.act__gson_request);

    mTvResult = (TextView) findViewById(R.id.tv_result);

    Button btnSimpleRequest = (Button) findViewById(R.id.btn_gson_request);
    btnSimpleRequest.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            RequestQueue queue=Volley.newRequestQueue(Act_GsonRequest.this);
            Map<String, String> stringMap = new HashMap<>();
            stringMap.put("from", "Kathmandu");
            stringMap.put("to", "Kakadvitta");
            stringMap.put("date", "2015-12-20");
            Log.e("Request body :::::", stringMap.toString());


            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json");
            headers.put("Authorization", "Basic YWRtaW46YWRtaW4=");
            headers.put("user", "admin");
            Log.e("Headers :::::", headers.toString());


            GsonRequest<MyClass1> req = new GsonRequest(
                    Method.POST,
                    "http://192.168.0.112:8080/customer/webresources/generic/trips",
                   MyClass1.class,
                    headers,
                    stringMap,
                    createMyReqSuccessListener(),
                    createMyReqErrorListener());


            queue.add(req);




        };

        });
}

private String buildRequestBody(Object content) {
    String output = null;
    if ((content instanceof String) ||
            (content instanceof JSONObject) ||
            (content instanceof JSONArray)) {
        output = content.toString();
    } else if (content instanceof Map) {
        Uri.Builder builder = new Uri.Builder();
        HashMap hashMap = (HashMap) content;
        if (hashMap != null) {
            Iterator entries = hashMap.entrySet().iterator();
            while (entries.hasNext()) {
                Map.Entry entry = (Map.Entry) entries.next();
                builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString());
                entries.remove();
            }
            output = builder.build().getEncodedQuery();
        }
    }

    return output;
}
private Response.Listener<MyClass1> createMyReqSuccessListener() {
    return new Response.Listener<MyClass1>() {
        @Override
        public void onResponse(MyClass1 response) {
           Log.e("Response message",response.getStatus());
        }
    };
}


private Response.ErrorListener createMyReqErrorListener() {
    return new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mTvResult.setText(error.getMessage());
            NetworkResponse networkResponse = error.networkResponse;
            if (networkResponse != null) {
                Log.e("Volley", "Error. HTTP Status Code:"+networkResponse.statusCode);
            }
            if (error instanceof TimeoutError) {
                Log.e("Volley", "TimeoutError");
            }else if(error instanceof NoConnectionError){
                Log.e("Volley", "NoConnectionError");
            } else if (error instanceof AuthFailureError) {
                Log.e("Volley", "AuthFailureError");
            } else if (error instanceof ServerError) {
                Log.e("Volley", "ServerError");
            } else if (error instanceof NetworkError) {
                Log.e("Volley", "NetworkError");
            } else if (error instanceof ParseError) {
                Log.e("Volley", "ParseError");
            }
        }
    };
}

}

【问题讨论】:

  • 欢迎来到 Stack Overflow。这个问题没有说明它在哪里失败或你试图解决你遇到的问题。
  • 它适用于 json 但当我尝试使用 gson 拨打电话时。它给了我意外的错误 400(大部分)。我不知道上面的代码有什么问题。

标签: android post gson android-volley


【解决方案1】:

如果由于互联网连接速度慢,请更改 RetryPolicy。只需将超时值设置为默认超时的两倍。工作正常。在queue.add(req);之前添加这个

  req.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
  queue.add(req);

【讨论】:

    【解决方案2】:

    在使用 jsonObject 而不是 hashmap 并在 GsonRequest 类中进行一些更改后,我成功地解决了这个问题。 无论如何谢谢你们的回应 快乐编码:)

    //执行api调用的内部活动

                    String url = "http://www.esewa.com/register/new";
    
                    RequestQueue queue = Volley.newRequestQueue(SignUpActivity.this);
                    JSONObject jsonObject = new JSONObject();
                    try {
                        jsonObject.put("some_key1", "some_value1");
    

    jsonObject.put("some_key2", "some_value2");

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    Log.d("Request bodyJson:::::", jsonObject.toString());
    
                    HashMap<String, String> headers = new HashMap<String, String>();
                    headers.put("Content-Type", "application/json");
                    Log.d("Headers :::::", headers.toString());
    

    GsonRequest 请求 = 新 GsonRequest( 请求.方法.POST, 网址, ResponseClass.class, 标头, json对象, createMyReqSuccessListener(), Utility.createMyReqErrorListener(coordinatorLayout,progressDialog,TAG))

    //GsonRequest 类

    公共类 GsonRequest 扩展请求 {

    private Gson gson = new Gson();
    private Class<T> clazz;
    private Map<String, String> headers;
    private Map<String, String> params;
    private Listener<T> listener;
    JSONObject jsonObject=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
     */
    public GsonRequest(int method,
                       String url,
                       Class<T> clazz,
                       Listener<T> listener,
                       ErrorListener errorListener) {
        super(method, url, errorListener);
        this.clazz = clazz;
        this.listener = listener;
        gson = new Gson();
    }
    
    /**
     * Make a POST 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
     */
    public GsonRequest(int method,
                       String url,
                       Class<T> clazz,
                       Map<String, String> headers,
                       JSONObject jsonObject,
                       Listener<T> listener,
                       ErrorListener errorListener) {
    
        super(method, url, errorListener);
        this.jsonObject = jsonObject;
        this.listener = listener;
        this.clazz = clazz;
        this.headers = headers;
        gson = new Gson();
    }
    
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return (headers != null) ? headers : super.getHeaders();
    }
    
    @Override
    public String getBodyContentType() {
        return "application/json; charset=utf-8";
    }
    
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return params;
    }
    

    //添加了这个getBody()方法

    @Override
    public byte[] getBody() throws AuthFailureError {
        try {
            return jsonObject.toString().getBytes(getParamsEncoding());
        } catch (UnsupportedEncodingException e) {
    
        }
        return null;
    }
    
    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }
    
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
        try {
            String jsonString = new String(networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers));
            T response = new GsonBuilder().create().fromJson(jsonString, clazz);
            //clazz.getClass()
            com.android.volley.Response<T> result = com.android.volley.Response.success(response,
                    HttpHeaderParser.parseCacheHeaders(networkResponse));
            return result;
        } catch (UnsupportedEncodingException e) {
            return com.android.volley.Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return com.android.volley.Response.error(new ParseError(e));
        }
    
    
    
    
    }
    
    @Override
    protected VolleyError parseNetworkError(VolleyError volleyError){
        if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){
            VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
            AppLog.showLog("Inside parseNetworkError::::::::: ");
            volleyError = error;
        }
    
        return volleyError;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2018-02-08
      相关资源
      最近更新 更多