【问题标题】:Android Volley not passing post parameters using custom requestAndroid Volley 未使用自定义请求传递 post 参数
【发布时间】:2015-10-13 17:24:33
【问题描述】:

我正在使用 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。我尝试了许多建议 herehere 但对我没有任何帮助。 Volley中是否有任何错误。 ?

请指导。

【问题讨论】:

  • 确保将所有强制参数发送到服务器。你有 400 即。 BAD_REQUEST,表示缺少该请求所必需的内容。
  • 我将所有必需的参数发送到服务器,但它们没有使用getParams()request body 传递给服务器。 Volley 没有发送参数。
  • 如果我没记错的话,getParams() 仅针对 POST 请求执行。
  • 我只请求POST 请求。

标签: android parameters android-volley http-status-code-400 network-connection


【解决方案1】:

Request 类中使用 getBody() 而不是 getParams() 时,它对我有用。

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

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

使用此链接了解更多说明。 How to send a POST request using volley with string body?

希望我的回答对你来说足够清楚。

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多