2

我正在使用 volley 进行简单的 REST 请求并在其中传递一些 post 参数。但它总是给予回应BasicNetwork.performRequest: Unexpected response code 400

我已尝试遵循自定义请求。

   public class GsonRequestRest<T> extends Request<T>{

   private static final String PROTOCOL_CHARSET = "utf-8";
   private static final String PROTOCOL_CONTENT_TYPE = String.format("application/json; charset=%s", PROTOCOL_CHARSET);
   private final Listener<T> mListener;
   private final String mRequestBody;
   private Gson mGson;
   private Class<T> mJavaClass;
   private Map<String, String> params;
   public GsonRequestLoginRest(int method, String url, Class<T> cls, String requestBody, Map<String, String> params,Listener<T> listener,ErrorListener errorListener) {
        super(method, url, errorListener);
        mGson = new Gson();
        mJavaClass = cls;
        mListener = listener;
        mRequestBody = requestBody;
        this.params = params;
   }
   @Override
   protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
        return params;
   };
   @Override
   protected void deliverResponse(T response) {
        mListener.onResponse(response);
   }
   private Map<String, String> headers = new HashMap<String, String>();
   @Override
   public Map<String, String> getHeaders() throws AuthFailureError {
        return headers;
   }
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            T parsedGSON = mGson.fromJson(jsonString, mJavaClass);

            return Response.success(parsedGSON,HttpHeaderParser.parseCacheHeaders(response));            
        } catch (IOException e) {
                Log.d("tag", e.getMessage());
                return Response.error(new ParseError(e));
            } catch (JsonSyntaxException je) {
                return Response.error(new ParseError(je));
            }
    }
    @Override
    public String getBodyContentType() {
        return PROTOCOL_CONTENT_TYPE;
    }
    @Override
    public byte[] getBody() {
        try {
            return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
        } catch (UnsupportedEncodingException uee) {
            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",mRequestBody, PROTOCOL_CHARSET);
            return null;
        }
    }
    //In your extended request class
    @Override
    protected VolleyError parseNetworkError(VolleyError volleyError){
        if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){
            VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
            volleyError = error;
        }
        return volleyError;
    }
}

我确实尝试在getParams()其中覆盖并传递参数。但它没有传递参数并抛出错误 400。我在这里这里尝试了很多建议,但对我没有任何帮助。Volley中是否有任何错误。?

请指导。

4

1 回答 1

0

它在使用getBody()而不是getParams()Request课堂上对我有用。

您应该使用的另一件事JSONObject而不是HashMap 放置您的参数

. 然后在方法中将 JSONObject 转换为字符串并将字符串转换为字节getBody

使用此链接以获得更多解释。 如何使用带有字符串正文的 volley 发送 POST 请求?

希望我的回答对您足够清楚。

于 2017-03-05T14:10:48.097 回答