Как выполнить запрос PUT в Android Volley?

В настоящее время я использую GsonRequest для отправки остальных запросов GET. Непонятно, что использовать для запросов PUT, где мне нужно отправить весь объект JSon для обновления. Объект Request будет принимать PUT, но я не уверен, как разместить объект JSon, который ожидается.

Вот мой json, чтобы быть PUT:

{ prop1 : true, prop2 : false, prop4 : true } 

Вот как он представлен в 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}"); 

Я не знаю, где поставить 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)); } } } 

А вот базовые методы 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); } } 

Предлагаемое решение:

  // 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(); } } 

Solutions Collecting From Web of "Как выполнить запрос PUT в Android Volley?"

Абстрактный Request базового класса имеет конструктор, который принимает Request.Method в качестве первого параметра. Все реализации Request в volley.toolbox также имеют такой же конструктор.

Я не уверен, откуда GsonRequest , но если у него нет конструктора, который принимает Method , вы можете добавить его самостоятельно.

Изменить: вы можете переопределить getBody и getBodyContentType чтобы вернуть тело пользовательского запроса и тип MIME соответственно.