Rails APIをAndroidでVolleyを使用してAPIに投稿しようとしています。これはコードです。
getParams()
とgetHeaders()
の2つのログステートメントを試しました。 getHeaders()
の1つはログに記録され、もう1つはログに記録されません。なぜボレーはgetParams()
を無視するのですか?
{
//full_name,email,password are private variables defined for this class
String url = "http://10.0.2.2:3000/users/sign_up.json" ;
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
}) {
@Override
public Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
//This does not appear in the log
Log.d(TAG,"Does it assign params?") ;
params.put("name", full_name.getText().toString());
params.put("email",email.getText().toString());
params.put("password", password.getText().toString());
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
//This appears in the log
Log.d(TAG,"Does it assign headers?") ;
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
// Adding request to request queue
VHelper.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
}
JsonObjectRequestの代わりにStringRequestを使用する
StringRequest sr = new StringRequest(Request.Method.POST, url , new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
Log.d(TAG, ""+error.getMessage()+","+error.toString());
}
}){
@Override
protected Map<String,String> getParams(){
Map<String, String> params = new HashMap<String, String>();
params.put("id", "28");
params.put("value", "1");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> headers = new HashMap<String, String>();
headers.put("Content-Type","application/x-www-form-urlencoded");
headers.put("abc", "value");
return headers;
}
};
AppController.getInstance().addToRequestQueue(sr);
volley paramsキャッシュが原因で発生しました。
このようにきれいに
requestQueue.getCache().clear();
お役に立てれば幸いです!????
3番目のパラメーターはJSONObjectである必要があります。getParams()メソッドは要求に渡すだけでよいので不要です。
JsonObjectRequest jsonObjReq = new JsonObjectRequest(
method,
url,
jsonObjParams, // <<< HERE
responseListener,
errorListener);
GetBody()メソッドをオーバーライドしてください。サーバーがJSONリクエストパラメータを処理できない場合は、getHeaders()メソッドをオーバーライドしてContent-Typeを変更する必要があります。
問題はここにあります: https://github.com/mcxiaoke/Android-volley/issues/82
JSONobjectRequestの場合、getParams()はPOST要求に対して機能しないため、customRequestを作成し、その上でgetParams()メソッドをオーバーライドする必要があります。これは、JsonObjectRequestがgetBody()メソッドをオーバーライドする拡張JsonRequestであるためですgetParams()メソッドを呼び出すには、最初にgetBody()をオーバーライドする必要があります。簡単なソリューションの場合は、StringRequestを使用できます。
ヘッダーからContent-Typeを削除するだけで問題を解決しました:)
リクエストオブジェクトをキューに追加する前に、shouldCache(false)
を使用してみてください。
POST
パラメータを提供するには、POSTパラメータを使用してJSONObject
を作成し、そのJSONObject
を3番目のパラメータとして渡します。JsonObjectRequest
コンストラクターは、リクエスト本文で使用されるJSONObject
をコンストラクターで受け入れます。
JSONObject paramJson = new JSONObject();
paramJson.put("key1", "value1");
paramJson.put("key2", "value2");
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,paramJson,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonObjectRequest);
キューキャッシュのクリアを使用して解決したのと同じ問題がありました
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.getCache().clear();
requestQueue.add(stringRequest);