VolleyでPOSTメソッドを使用しようとするたびに、サーバーエラーが発生します。getCauseでnull値、getNetworkResponse.toString()でデフォルト値を取得します。
GETメソッドを使用する場合、これは正常に機能します(URLから応答を取得します)。
誰でも私ができることを助けることができますか?
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("teststr", "abd");
RequestQueue requestQueue = VolleySingleton.getInstance().getRequestQueue();
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.POST,
url,
new JSONObject(jsonParams),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Toast.makeText(getApplicationContext(), "Success"+response.toString(), Toast.LENGTH_LONG).show();
}catch(Exception e){
Toast.makeText(getApplicationContext(), "JSON ERROR", Toast.LENGTH_LONG).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("abd", "Error: " + error
+ ">>" + error.networkResponse.statusCode
+ ">>" + error.networkResponse.data
+ ">>" + error.getCause()
+ ">>" + error.getMessage());
}
}) {
@Override
protected Map<String,String> getParams() {
HashMap<String, String> params = new HashMap<String, String>();
params.put("key", "value");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
requestQueue.add(request);
エラーログ:
エラー:エラー:com.Android.volley.ServerError >> 404 >> [B @ 42b1e0d0 >> null >> null
PDATE:networkResponse.statusCodeは404になりますが、URLにアクセスできます(GETメソッドを使用する場合はデータを返します)。POSTメソッド、それでも同じです。
RL:
<?php
$response = array();
$jsonString = file_get_contents('php://input');
$jsonObj = json_decode($jsonString, true);
if(!isset($jsonObj['teststr'])){
$response["msg"] = "No data.";
}else{
$response["msg"] = "Success: ".$jsonObj['teststr'];
}
echo json_encode($response);
?>
問題はあなたのキューです。ボレーコードを次のように変更します。
RequestQueue queue = Volley.newRequestQueue(this);
String URL = EndPoints.BASE_URL + "/call";
StringRequest request = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Log.d("onResponse", response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
NetworkResponse response = error.networkResponse;
String errorMsg = "";
if(response != null && response.data != null){
String errorString = new String(response.data);
Log.i("log error", errorString);
}
}
}
) {
@Override
protected Map<String, String> getParams()
{
Map<String, String> params = new HashMap<String, String>();
params.put("key_1","value_1");
params.put("key_2", "value_2");
Log.i("sending ", params.toString());
return params;
}
};
// Add the realibility on the connection.
request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f));
// Start the request immediately
queue.add(request);
これにあなたのPHP(laravel)コード:
$response['success'] = true;
$response['user']['tell'] = $user->tell;
$response['user']['code'] = $user->code;
$response['user']['time'] = $time;
$response['user']['register_state'] = '1'
return response()->json($response, 200);
キューに追加する前にこのコードを追加してください
request.setRetryPolicy(new DefaultRetryPolicy(0、-1、DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
時々、PHPが完全に実行される前にリクエストがタイムアウトになることがあります。このコードを試してください。多分助けることができる
応答を文字列として表示しようとすると、エラーが発生しました。
エラーを表示したり使用したりする場合は、response.toString()
を使用します。
Volleyは、組み込みのPOSTメソッドパラメーターを完全に処理しないため、カスタム応答を作成する必要があります。
回答はkatwal-Dipakがこれに似た他の投稿に投稿しています。 https://stackoverflow.com/a/31532955/4969957
これは完璧に機能しています。ありがとう。
まあ、私はあなたのlogcatでresponseCodeを最初に印刷できると思います
多分それはあなたのオペレータに関連しています...
VolleyでJasonObjectを送信するのと同じ問題があります。
2つの異なる演算子を使用して、9〜10台のデバイスでアプリをテストしました。
1つのオペレーターのリクエストは、すべてがnullまたは空白のデータを含むエラーを返します。もう1つのオペレーターのリクエストはすべて正常に動作し、APIからの応答を正常に取得します。
オペレーターがこの問題を引き起こす原因は何なのかわかりません。たぶん、彼らはJsonObjectの送信をブロックするある種のファイアウォールを使用しています。