【问题标题】:Android Volley getParams Not Called for Custom Request自定义请求未调用 Android Volley getParams
【发布时间】:2017-01-21 12:24:39
【问题描述】:

我创建了一个自定义的Volley Request 类,它扩展了Request<NetworkResponse>。这是该自定义类的代码:

public class MultipartRequest extends Request<NetworkResponse> {
    private final Response.Listener<NetworkResponse> mListener;
    private final Response.ErrorListener mErrorListener;
    private final Map<String, String> mHeaders;
    private final Map<String, String> mParams;
    private final String mMimeType;
    private final byte[] mMultipartBody;

    public MultipartRequest(String url, Map<String, String> headers, Map<String, String> params, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.mListener = listener;
        this.mErrorListener = errorListener;
        this.mHeaders = headers;
        this.mParams = params;
        this.mMimeType = mimeType;
        this.mMultipartBody = multipartBody;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Log.i("MultipartRequest", "headers = " + mHeaders);
        return mHeaders;
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Log.i("MultipartRequest", "params = " + mParams);
        return mParams;
    }

    @Override
    public String getBodyContentType() {
        return mMimeType;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        return mMultipartBody;
    }

    @Override
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
        try {
            return Response.success(
                response,
                HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

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

    @Override
    public void deliverError(VolleyError error) {
        mErrorListener.onErrorResponse(error);
    }
}

我在getHeaders()getParams() 中插入了Log.i 语句,以确保它们被正确调用。我按如下方式创建请求:

final Map<String, String> volleyParams = new HashMap<>();
volleyParams.put("size", String.valueOf(data.imageSize));
volleyParams.put("width", String.valueOf(data.imageWidth));
volleyParams.put("height", String.valueOf(data.imageHeight));
volleyParams.put("isIndex", updateProfilePhoto ? "1" : "0");

final Context context = this;
final String twoHyphens = "--";
final String lineEnd = "\r\n";
final String boundary = "apiclient-" + System.currentTimeMillis();
final String mimeType = "multipart/form-data;boundary=" + boundary;
byte[] multipartBody = new byte[0];

ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
try {
    // the first file
    buildPart(dos, data.thumbnailImageArray, "file0");
    // the second file
    buildPart(dos, data.scaledImageArray, "file1");
    // send multipart form data necesssary after file data
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
    // pass to multipart body
    multipartBody = bos.toByteArray();
} catch (IOException e) {
    e.printStackTrace();
}

Map<String, String>  headers = new HashMap<String, String>();
headers.put("User-Agent", Authentication.getUserAgent());
headers.put("X-XX-API", Authentication.getKey());

MultipartRequest multipartRequest = new MultipartRequest(BASE_URL + "member/photos", headers, volleyParams, mimeType, multipartBody, new Response.Listener<NetworkResponse>() {
    @Override
    public void onResponse(NetworkResponse response) {
        Log.i(LOG_TAG, "response: " + response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        Log.i(LOG_TAG, "statusCode = " + error.networkResponse.statusCode);
        Log.i(LOG_TAG, "data = " + error.networkResponse.data);
        Log.i(LOG_TAG, "headers = " + error.networkResponse.headers);
        Log.i(LOG_TAG, "notModified = " + error.networkResponse.notModified);
        Log.i(LOG_TAG, "networkTimeMs = " + error.networkResponse.networkTimeMs);
        }
    });

    MySingleton.getInstance(context).addToRequestQueue(multipartRequest);

调用已执行,但从未调用过getParams()。如何确保始终调用 getParams()

【问题讨论】:

标签: android rest post android-volley


【解决方案1】:

我也遇到了同样的问题。您需要覆盖 getBody 方法并将所有参数转换为字节数组。例如,对于 JSON 请求。

@Override
public String getBodyContentType() {
    return "application/json; charset=utf-8";
}

@Override
public byte[] getBody() {
    if (mParams == null) {
        return null;
    }

    try {
        return new Gson().toJson(mParams).getBytes("utf-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return null;
}

【讨论】:

  • 我在将其与多部分消息的正文结合时遇到问题。我想上传2个带参数的文件。正文当前包含所有多部分数据。如果我只组合 2 字节数组,它会起作用吗?目前我没有运气组合它们。
  • 您是否尝试过为您的文件覆盖 getByteData?看下面链接的最后一个答案stackoverflow.com/questions/32240177/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 2015-10-13
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2013-07-30
相关资源
最近更新 更多