2013-08-02 2 views
6

私は現在GsonRequestを使用して残りのGETリクエストを発行しています。更新されるJSonオブジェクト全体を送信する必要があるPUTリクエストに何を使用するかは不明です。 RequestオブジェクトはPUTを受け入れますが、JSonオブジェクトがどのように配置されるかはわかりません。 Android VolleyでPUTリクエストを実行するにはどうすればよいですか?

は、ここに私のJSONをPUTする:

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をどこに置くか分からない:

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

は例えばapiary.ioで提出する方法です。

おかげ

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

} 

答えて

5

抽象基底クラスRequestは、最初のパラメータとしてRequest.Methodを取るコンストラクタを有します。 volley.toolboxのすべてのリクエストの実装にも同様のコンストラクタがあります。

GsonRequestはどこから来ているのか分かりませんが、Methodのコンストラクタがない場合は、自分で追加できます。

編集:getBodygetBodyContentTypeをそれぞれ上書きして、カスタム要求の本文とMIMEタイプを返すことができます。

+0

GsonRequestで質問を更新しました。このリクエストにJSON文字列をどこに置くかはわかりません。 – TestBest

+4

データの送信をサポートしていないようです。 'getBody'と' getBodyContentType'をオーバーライドして、シリアライズされたオブジェクトと適切なMIMEタイプ(例えば、 'application/json')を返す必要があります。 – Delyan

+0

javascriptのapiary.ioでputを呼び出す方法を投稿しました。 – TestBest

関連する問題