2013-08-02 2 views
6

J'utilise actuellement GsonRequest pour émettre des requêtes GET de repos. Pas clair sur ce qu'il faut utiliser pour les demandes PUT où j'ai besoin d'envoyer un objet JSon entier à mettre à jour. L'objet Request acceptera PUT mais je ne suis pas sûr de savoir comment placer l'objet JSon attendu.comment exécuter la demande PUT dans Android Volley?

Voici mon JSON à PUT:

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

Voici comment son soumis à apiary.io par exemple:

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

Je ne sais pas où mettre le JSON.

Merci

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

Et voici les méthodes de getBody de base à l'intérieur de la demande. Il semble gérer les paramètres sur le Method.PUT, mais que se passe-t-il si c'est une chaîne JSON qui doit être envoyée dans le corps?

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

solution proposée:

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

} 

Répondre

5

La classe de base abstraite Request a un constructeur qui prend un Request.Method comme le premier paramètre. Toutes les implémentations de demande dans volley.toolbox ont aussi un constructeur comme ça.

Je ne suis pas sûr d'où vient GsonRequest mais s'il n'a pas de constructeur qui prend un Method, vous pouvez en ajouter un vous-même.

Modifier: Vous pouvez remplacer getBody et getBodyContentType pour renvoyer le corps de la requête personnalisée et le type MIME respectivement.

+0

J'ai mis à jour ma question avec GsonRequest. Je ne sais pas où placer la chaîne JSON dans cette requête. – TestBest

+4

Il semble qu'il ne supporte pas la soumission de données. Vous devez remplacer 'getBody' et' getBodyContentType' pour retourner l'objet sérialisé et un bon type MIME (par exemple, 'application/json') – Delyan

+0

J'ai posté comment put est invoqué dans javascript apiary.io – TestBest