当前位置: 首页 > 知识库问答 >
问题:

Volley没有为我的自定义请求调用getParams?

洪飞驰
2023-03-14

请问,凌空是否会自动将我的GET参数添加到URL?对我来说,它不起作用,所以在查找源代码时,我只是找不到任何对getParams方法的调用。。那么我应该自己建立URL吗?这一点都没有问题,我只是想,当有像getParams这样的方法时,它可以为我做到这一点:)

更新:下面是我的代码。。

public class BundleRequest extends com.android.volley.Request<Bundle>{

    private String token;
    private OnAuthTokenValidatorResponseListener mListener;
    private final Map<String, String> mParams =  new HashMap<String, String>();;


    public BundleRequest(int method, String url,  Response.ErrorListener listener) {
        super(method, url, listener);
    }

    public BundleRequest(int method, String url,OnAuthTokenValidatorResponseListener providedListener,  Response.ErrorListener listener, String token) {
        super(method, url, listener);
        this.token = token;
        mListener = providedListener;
        mParams.put(AuthenticatorConfig.TOKEN_VALIDATION_PARAMNAME, token);

    }

    @Override
    public Map<String, String> getParams() throws AuthFailureError {
        return mParams;
    }




    @Override
    protected Response<Bundle> parseNetworkResponse(NetworkResponse httpResponse) {
        switch (httpResponse.statusCode) {
            case AuthTokenValidator.TOKEN_VALID_RESPONSE_CODE:
                //token is ok
                JSONObject response;
                try {
                        response = new JSONObject(new String(httpResponse.data, HttpHeaderParser.parseCharset(httpResponse.headers)));
                        Bundle userDataResponse = new Bundle();
                        userDataResponse.putInt("responseCode", httpResponse.statusCode);
                        userDataResponse.putString("username", response.getString("user_id"));
                        userDataResponse.putString("email", response.getString("user_email"));
                        userDataResponse.putString("expiresIn", response.getString("expires_in"));
                        userDataResponse.putString("scope", response.getJSONArray("scope").getString(0));
                        userDataResponse.putString("token", token);
                    return Response.success(userDataResponse, HttpHeaderParser.parseCacheHeaders(httpResponse));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    return Response.error(new VolleyError("Unsupported encoding"));


                } catch (JSONException e) {
                    e.printStackTrace();
                    return Response.error(new VolleyError("Problem while parsing JSON"));
                }




            case AuthTokenValidator.TOKEN_INVALID_RESPONSE_CODE:
                //token is not valid
                mListener.onValidatorResponse(httpResponse.statusCode);
                try {
                    mListener.onValidatorResponse(parseOnErrorResponse(new String(httpResponse.data, HttpHeaderParser.parseCharset(httpResponse.headers))));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

            default:
                return Response.error(new VolleyError("Error status code:" + httpResponse.statusCode));

        }
    }

    protected int parseOnErrorResponse(String responseBody) {
        try {
            JSONObject response = new JSONObject(responseBody);
            String moreInfo = response.getString("more_info");
            if (moreInfo.equals("Token was not recognised")) {
                return AuthTokenValidator.TOKEN_WAS_NOT_RECOGNISED;
            } else if (moreInfo.equals("Token has expired")) {
                return AuthTokenValidator.TOKEN_HAS_EXPIRED;
            } else if (moreInfo.equals("Client doesn't exist anymore")) {
                return AuthTokenValidator.CLIENT_DOES_NOT_EXIST_ANYMORE;
            } else if (moreInfo.equals("Client is locked")) {
                return AuthTokenValidator.CLIENT_IS_LOCKED;
            } else {
                return AuthTokenValidator.UNKNOWN_ERROR;
            }

        } catch (JSONException e) {
            e.printStackTrace();
            return AuthTokenValidator.UNKNOWN_ERROR;
        }

    }

    @Override
    protected void deliverResponse(Bundle response) {
        mListener.onGetUserDataResponse(response);
    }
}

实际上,params参数现在是冗余的

共有3个答案

祁修平
2023-03-14

试试这个,

public class LoginRequest extends Request<String> {

    // ... other methods go here

    private Map<String, String> mParams;

    public LoginRequest(String param1, String param2, Listener<String> listener, ErrorListener errorListener) {
        super(Method.POST, "http://test.url", errorListener);
        mListener = listener;
        mParams.put("paramOne", param1);
        mParams.put("paramTwo", param2);

    }

    @Override
    public Map<String, String> getParams() {
        return mParams;
    }
}

再看这个例子,

https://github.com/evancharlton/folly/

越国源
2023-03-14

关于Itai Hanski的回答,这是一个实现的示例:

 for(String key: params.keySet()) {
   url += "&"+key+"="+params.get(key);
 }
马亮
2023-03-14

GET方法上未调用getParams(),因此似乎必须在发送请求之前将其添加到URL。

查看JavaDoc:

返回用于POST或PUT请求的参数映射。

可以抛出{@link AuthFailureError},因为提供这些值可能需要身份验证。

注意,您可以直接为自定义数据重写{@link#getBody()}。

@在身份验证失败时抛出AuthFailureError

 类似资料:
  • 我想为我所有的截击请求创建一个Auth头,我已经学会了如何创建一个覆盖请求类的getHeaders的头,但是我不能不时地在每个请求中更改它,我想使它成为一种静态的或全局的,我可以在任何地方更改它。以下是我到目前为止所做的尝试。 主要活动类 我尝试创建一个自定义类来扩展堆栈并重写执行请求。下面是名为GlobalHeaders的自定义堆栈类的代码 现在我不确定如何在我的主类中使用这个方法,在那里我添加

  • 我试图使用Volley库向服务器发出一个JSONObject POST请求,该请求包含两个参数,一个对象(地址)和一个不同对象(租户)的列表。 当我尝试发出请求时,第一个参数(地址)在发送之前被截取格式化,服务器不接受该请求。 我的请求如下所示: 我的postPropertyJSONObject是这样创建的: convertAddressToJson()方法如下所示: 我尝试只是传递地址对象,但这

  • 如何将自定义标头添加到HttpClient请求?我使用方法发布JSON。我需要添加的自定义标题是 这是我到目前为止所做的:

  • 我正在尝试使用JS SDK在Dropbox上上传一个文件。下面是我试图调用函数的html代码: 这是定义函数的文件 但是,由于我不知道的原因,我的函数不能被调用。我得到错误“referenceerror:Dropupload is not defined”,我不知道这是否与问题有关,但我得到另一个错误:“syntaxerror:import declarations may only at top

  • 我对Symfony和API平台很陌生。我正在尝试创建一个自定义资源/操作,该资源/操作接收请求的正文,根据值从数据库中获取数据,然后将实体集合返回给客户端。 示例:具有以下正文的 请求: 根据这些属性,我想查询数据,进行计算,然后返回数据。 我试图弄清楚如何使这个API平台的方式。我已经在谷歌上搜索并在留档中寻找了几个小时,但我找不到实现这一目标的方法。 我尝试使用和如下所示的控制器查询数据: 但

  • 问题内容: 我想知道是否可以通过添加自定义信息来配置所有$ http请求标头。像config这样的东西: 但是对于所有$ http呼叫,我将使用不同的服务。我敢肯定有一个解决方案:D。谢谢 问题答案: 您可以创建一个拦截器来扩展标题: