2013-08-02 52 views
6

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

} 

Trả lời

5

Các cơ sở trừu tượng lớp Request có một constructor mà phải mất một Request.Method như tham số đầu tiên. Tất cả các yêu cầu triển khai trong volley.toolbox cũng có một hàm tạo như vậy.

Tôi không chắc chắn nơi nào GsonRequest đến từ nhưng nếu nó không có một hàm tạo có số Method, bạn có thể tự thêm một mình.

Chỉnh sửa: Bạn có thể ghi đè getBodygetBodyContentType để trả lại loại yêu cầu tùy chỉnh và loại MIME tương ứng.

+0

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

+4

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

+0

Tôi đã đăng cách put được gọi trong javascript apiary.io – TestBest

Các vấn đề liên quan