Tôi hiện đang sử dụng GsonRequest để phát hành các yêu cầu GET còn lại. Không rõ ràng về những gì cần sử dụng cho các yêu cầu PUT mà tôi cần gửi qua toàn bộ đối tượng JSon được cập nhật. Đối tượng Request sẽ chấp nhận PUT nhưng tôi không chắc chắn cách đặt đối tượng JSon được mong đợi.cách thực thi yêu cầu PUT trong Android Volley?
Đây là json tôi để được PUT:
{
prop1 : true,
prop2 : false,
prop4 : true
}
Sau đây là cách của mình gửi trong apiary.io ví dụ:
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}");
Tôi không biết nơi để đặt các JSON.
Cảm ơn
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));
}
}
}
Và đây là những phương pháp cơ sở getBody bên trong yêu cầu. Dường như nó xử lý các tham số trên Method.PUT, nhưng nếu chuỗi JSON của nó cần được gửi trong cơ thể thì sao?
/**
* 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);
}
}
giải pháp Đề xuất:
// 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();
}
}
Tôi đã cập nhật câu hỏi của mình với GsonRequest. Tôi không biết phải đặt chuỗi JSON trong yêu cầu này ở đâu. – TestBest
Có vẻ như nó không hỗ trợ gửi dữ liệu. Bạn sẽ cần ghi đè 'getBody' và' getBodyContentType' để trả về đối tượng được tuần tự hóa và kiểu MIME thích hợp (ví dụ, 'application/json') – Delyan
Tôi đã đăng cách put được gọi trong javascript apiary.io – TestBest