如何在Android Volley中执行PUT请求?

Tes*_*est 6 android android-volley

我目前正在使用GsonRequest发出其余的GET请求.不清楚PUT请求的用途,我需要通过整个JSon对象发送更新.Request对象将接受PUT,但我不确定如何放置预期的JSon对象.

这是我的json要PUT:

 {
   prop1 : true,
   prop2 : false,
   prop4 : true
 }
Run Code Online (Sandbox Code Playgroud)

以下是它在apiary.io中的提交方式,例如:

  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://my.apiary.io/v1/records/{myid}.json');

    xhr.send("{\n    \"isEditable\": false,\n    \"isClosed\": true,\n        \"isAvail\": true\n}");
Run Code Online (Sandbox Code Playgroud)

我不知道把JSON放在哪里.

谢谢

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

private final Gson gson ;
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;

public GsonRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
        Listener<T> listener, ErrorListener errorListener) {
    super(method, url, errorListener);

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Timestamp.class, new TimestampDeserializer());
    this.gson = gsonBuilder.create();
    this.clazz = clazz;
    this.headers = headers;
    this.listener = listener;
}

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

@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(
                gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
   }
}
Run Code Online (Sandbox Code Playgroud)

以下是请求中的基本getBody方法.它似乎处理Method.PUT上的参数,但如果它的JSON字符串需要在正文中发送呢?

/**
 * Returns the raw POST or PUT body to be sent.
 *
 * @throws AuthFailureError in the event of auth failure
 */
public byte[] getBody() throws AuthFailureError {
    Map<String, String> params = getParams();
    if (params != null && params.size() > 0) {
        return encodeParameters(params, getParamsEncoding());
    }
    return null;
}

/**
 * Converts <code>params</code> into an application/x-www-form-urlencoded encoded string.
 */
private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
    StringBuilder encodedParams = new StringBuilder();
    try {
        for (Map.Entry<String, String> entry : params.entrySet()) {
            encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
            encodedParams.append('=');
            encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
            encodedParams.append('&');
        }
        return encodedParams.toString().getBytes(paramsEncoding);
    } catch (UnsupportedEncodingException uee) {
        throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
    }
}
Run Code Online (Sandbox Code Playgroud)

建议的解决方案:

     // add a Json body.
    public String jsonBody;  

  /**
   * Returns the raw POST or PUT body to be sent.
   *
   * @throws AuthFailureError in the event of auth failure
   */



   public byte[] getBody() throws AuthFailureError {

     if ((getMethod() == Method.PUT) && (jsonBody != null))
     {
        return jsonBody.getBytes();  // Encoding required?????

     }
     else
     {
       return super.getBody();
     }

 }
Run Code Online (Sandbox Code Playgroud)

Del*_*yan 5

抽象基类Request有一个构造函数,它将a Request.Method作为第一个参数.所有的Request实现volley.toolbox也都有类似的构造函数.

我不确定GsonRequest从哪里来,但如果它没有一个构造函数Method,你可以自己添加一个.

编辑:您可以分别覆盖getBodygetBodyContentType返回自定义请求正文和MIME类型.

  • 它似乎不支持提交数据.您需要覆盖`getBody`和`getBodyContentType`以返回序列化对象和正确的MIME类型(例如,`application/json`) (4认同)