私はPOST Volley JsonObjectRequestのパラメーターを送信しようとしています。最初は、それは機能していました公式コードでは、JsonObjectRequestのコンストラクターにパラメーターを含むJSONObjectを渡すように指示されていますが、突然動作が停止し、以前に動作していたコードに変更を加えていません。 any POSTパラメーターが送信されています。私のコードは次のとおりです。
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";
// POST parameters
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
JSONObject jsonObj = new JSONObject(params);
// Request a json response from the provided URL
JsonObjectRequest jsonObjRequest = new JsonObjectRequest
(Request.Method.POST, url, jsonObj, new Response.Listener<JSONObject>()
{
@Override
public void onResponse(JSONObject response)
{
Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
});
// Add the request to the RequestQueue.
queue.add(jsonObjRequest);
サーバー上のシンプルなテスターPHPコード:
$response = array("tag" => $_POST["tag"]);
echo json_encode($response);
私が受け取る応答は{"tag":null}
昨日、問題なく動作し、{"tag":"test"}
私は1つのことを変更していませんが、今日はもう機能していません。
Volleyソースコードコンストラクターjavadocでは、コンストラクターにJSONObjectを渡して、「@ param jsonRequest」で投稿パラメーターを送信できると書かれています。 https://Android.googlesource.com/platform/frameworks/volley/+ /master/src/main/Java/com/Android/volley/toolbox/JsonObjectRequest.Java
/ **
*新しいリクエストを作成します。
* @param method使用するHTTPメソッド
* JSONを取得する@param url URL
* @param jsonRequestリクエストとともに投稿する{@link JSONObject}。ヌルは許可され、
*は、リクエストとともにパラメーターがポストされないことを示します。
私は同様の質問を持つ他の投稿を読みましたが、解決策は私のために機能していません:
Volley JsonObjectRequest Post request not working
Volley Post JsonObjectRequest getHeaderおよびgetParamsの使用中にパラメーターを無視する
JsonObjectRequestコンストラクターのJSONObjectをnullに設定してから、「getParams()」、「getBody()」、および「getPostParams()」メソッドのパラメーターをオーバーライドおよび設定しようとしましたが、これらのオーバーライドは機能しませんでした私。別の提案は、基本的にカスタム要求を作成する追加のヘルパークラスを使用することでしたが、その修正は私のニーズには少し複雑すぎます。それに落ち着いた場合、私はそれを機能させるために何でもしますが、私のコードwasについての単純な理由があることを望んでいます動作してから、stoppedだけでなく、簡単なソリューション。
私は代わりにVolleyのStringRequestを使用することになりました。JsonObjectRequestを機能させるために貴重な時間を費やしすぎていたからです。
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";
StringRequest strRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map<String, String> getParams()
{
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
return params;
}
};
queue.add(strRequest);
これは私のために働いた。 JsonObjectRequestと同じくらい簡単ですが、代わりにStringを使用します。
パラメーターのHashMapからJSONObjectを作成するだけです。
String url = "https://www.youraddress.com/";
Map<String, String> params = new HashMap();
params.put("first_param", 1);
params.put("second_param", 2);
JSONObject parameters = new JSONObject(params);
JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//TODO: handle success
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
//TODO: handle failure
}
});
Volley.newRequestQueue(this).add(jsonRequest);
同様の問題がありましたが、問題はクライアント側ではなく、サーバー側にあることがわかりました。 JsonObject
を送信するとき、POSTオブジェクト(サーバー側))を取得する必要があります。
PHPの場合:
$json = json_decode(file_get_contents('php://input'), true);
StringRequestを使用して、JsonObjectRequestでできることと同じことを行うことができますが、それでもPOSTパラメーターを送信できます。取得し、そこからJsonObjectRequestのように続行できます。
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
//Creating JsonObject from response String
JSONObject jsonObject= new JSONObject(response.toString());
//extracting json array from response string
JSONArray jsonArray = jsonObject.getJSONArray("arrname");
JSONObject jsonRow = jsonArray.getJSONObject(0);
//get value from jsonRow
String resultStr = jsonRow.getString("result");
} catch (JSONException e) {
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> parameters = new HashMap<String,String>();
parameters.put("parameter",param);
return parameters;
}
};
requestQueue.add(stringRequest);
JSONObjectオブジェクトを使用してパラメーターを送信すると、パラメーターはHTTP POSTリクエスト本文でJSON形式になります。
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
params.put("tag2", "test2");
JSONObject jsonObj = new JSONObject(params);
このJSONオブジェクトを作成し、HTTP POSTリクエストの本文に挿入します:
{"tag":"test","tag2":"test2"}
次に、サーバーはJSONをデコードして、これらのPOSTパラメーターを理解する必要があります。
しかし、通常、HTTP POSTパラメーターは次のように本文に書き込まれます。
tag=test&tag2=test2
しかし、今ここで問題は、ボレーがこのように設定されている理由ですか?
HTTP POSTメソッドを読み取るサーバーは、標準では常に(プレーンテキスト以外の)JSONでもパラメーターを読み取ろうとする必要があるため、達成できないサーバーは不良サーバーですか?
または代わりに、HTTP POST JSONのパラメーターを持つ本文は、通常サーバーが望むものではありませんか?
同様の問題がありました。しかし、問題はサーバー側ではなく、キャッシュにあることがわかりました。 RequestQueueキャッシュをクリアする必要があります。
RequestQueue requestQueue1 = Volley.newRequestQueue(context);
requestQueue1.getCache().clear();
誰かを助け、考える時間を節約するかもしれません。同様の問題がありました。サーバーコードはContent-Typeヘッダーを探していました。それは次のようにしていました:
if($request->headers->content_type == 'application/json' ){ //Parse JSON... }
しかし、Volleyは次のようなヘッダーを送信していました。
'application/json; charset?utf-8'
サーバーコードをこれに変更すると、トリックが行われました:
if( strpos($request->headers->content_type, 'application/json') ){ //Parse JSON...
前述のCustomJsonObjectRequestヘルパークラスを使用します here 。
そして、このように実装します-
CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(), "Error.", Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("id", id);
params.put("password", password);
return params;
}
};
VolleySingleton.getInstance().addToRequestQueue(request);
次の方法で実行できます。
CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// Toast.makeText(SignActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
Log.d("response",""+response.toString());
String status = response.optString("StatusMessage");
String actionstatus = response.optString("ActionStatus");
Toast.makeText(SignActivity.this, ""+status, Toast.LENGTH_SHORT).show();
if(actionstatus.equals("Success"))
{
Intent i = new Intent(SignActivity.this, LoginActivity.class);
startActivity(i);
finish();
}
dismissProgress();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(SignActivity.this, "Error."+error.toString(), Toast.LENGTH_SHORT).show();
Log.d("response",""+error.toString());
dismissProgress();
}
}) {
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=UTF-8";
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("Email", emailval);
params.put("PassWord", passwordval);
params.put("FirstName", firstnameval);
params.put("LastName", lastnameval);
params.put("Phone", phoneval);
return params;
}
};
AppSingleton.getInstance(SignActivity.this.getApplicationContext()).addToRequestQueue(request, REQUEST_TAG);
リンクの下のCustomRequestによる Volley JsonObjectRequest Post request not working
動作します。
これを使用してjsonオブジェクトの応答を解析しました:-チャームのように動作します。
String tag_string_req = "string_req";
Map<String, String> params = new HashMap<String, String>();
params.put("user_id","CMD0005");
JSONObject jsonObj = new JSONObject(params);
String url="" //your link
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
url, jsonObj, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("responce", response.toString());
try {
// Parsing json object response
// response will be a json object
String userbalance = response.getString("userbalance");
Log.d("userbalance",userbalance);
String walletbalance = response.getString("walletbalance");
Log.d("walletbalance",walletbalance);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
AppControllerVolley.getInstance().addToRequestQueue(jsonObjReq, tag_string_req);
幸運を!おやすみなさい!