4

現在、Google Volley を介してサーバーに簡単な POST リクエストを送信しようとしています。したがって、次のコード行を記述しました。

Map<String, String> params = new HashMap<String, String>();
params.put("regId", "skdjasjdaljdlksajskl");
JSONObject object = new JSONObject(params);
JsonObjectRequest request = new JsonObjectRequest(Method.POST,
                "address_of_my_server/method", object,
                successListener, errorListener);
queue.add(request);

しかし、エラー 500 が返されました。これは、パラメーター (regId) が不足していることを示しています。GET-Request でも同じことを試しましたが、同じ結果が得られました。

「address_of_my_server/method?regId=sadlasjdlasdklsj」のようなフォーマットされた URL で StringRequest を使用している場合にのみ、サーバーは 200 で応答します。

次のような StringRequest を使用すると、まったく同じ結果が得られます。

StringRequest request = new StringRequest(Method.POST,
                "myurl", successListener,
                errorListener){
            @Override
            protected Map<String, String> getParams()
                    throws AuthFailureError {
               Map<String, String> params = new HashMap<String, String>();
               params.put("regId", "skdjasjdaljdlksajskl");
               return params;
            }
        };

Volley が私のパラメーターを無視するのはなぜですか?

4

5 に答える 5

3

このヘルパー クラスを使用します。

import java.io.UnsupportedEncodingException;
import java.util.Map;    
import org.json.JSONException;
import org.json.JSONObject;    
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class CustomRequest extends Request<JSONObject> {

private Listener<JSONObject> listener;
private Map<String, String> params;

public CustomRequest(String url, Map<String, String> params,
        Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(Method.GET, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

public CustomRequest(int method, String url, Map<String, String> params,
        Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(method, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

protected Map<String, String> getParams()
        throws com.android.volley.AuthFailureError {
    return params;
};

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));
        return Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }
}

@Override
protected void deliverResponse(JSONObject response) {
    // TODO Auto-generated method stub
    listener.onResponse(response);
    }
}
于 2013-11-13T04:52:56.107 に答える
3

先週も同じ問題がありましたが、現在は修正されています。サーバーは Content-Type を form-data として受け入れます。volley の JsonObjectRequest を送信すると、リクエストの content-type は application/json になるため、Stringrequest のようにキーと値のペアとしてではなく、パラメータ全体が 1 つの json 本体として送信されます。キーから取得するのではなく、http リクエスト本文からリクエスト パラメータを取得するようにサーバー コードを変更します (php の $_REQUEST['name'] など)。

于 2013-11-07T03:16:50.097 に答える
2

Rajesh Batth が言及した問題のウォーキング例

Java コード:

    JSONObject obj = new JSONObject();
    try {
        obj.put("id", "1");
        obj.put("name", "myname");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(
            Request.Method.POST, url, obj, listener, errorlistener);

    RequestQueue queue = Volley.newRequestQueue(context);
    queue.add(jsObjRequest);

PHP コード:

    $body = file_get_contents('php://input');
    $postvars = json_decode($body, true);
    $id = $postvars["id"];
    $name = $postvars["name"];

ノート:

追加の GET-VARS を送信しない場合、 PHP-Vars$_POST$_REQUESTおよびは空です。$_GET

于 2014-02-13T10:15:28.000 に答える
1

編集:

正確ではないため、以前の回答を削除しました。

今日私が知っていることを説明します。どうやら、うまくいくgetParamsはずです。しかし、常にそうとは限りません。私はそれを自分でデバッグしましたが、PUT または POST 要求を実行するときに呼び出されているようで、そのメソッドで提供されるパラメーターは通常の GET パラメーター文字列 ( ?param1=value1&param2=value2...) にあり、エンコードされて本文に入れられます。

理由はわかりませんが、何らかの理由でこれが一部のサーバーでは機能しません。

パラメーターを送信するための私が知っている最良の代替方法は、パラメーターを に入れJSONObject、リクエスト コンストラクターを使用して、その内容をリクエストの本文にエンコードすることです。

于 2013-11-04T08:20:34.653 に答える
0

これが私の解決策です

解決策1

 public void getData() {
    final RequestQueue queue = Volley.newRequestQueue(this);
    StringRequest postRequest = new StringRequest(Request.Method.POST, "192.168.0.0/XYZ",new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONArray myArray = new JSONArray(response);

                        for(int i = 0; i < myArray.length(); i++)
                        {
                            JSONObject jObj = myArray.getJSONObject(i);
                            String category = jObj.getString("nameUser");
                            Log.e("value", category);

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e("error: ", e.getMessage());
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //Toast.makeText(context,"Error : ").show();
        }
    }){
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("id_user", "1");
            return params;
        }
    };
    queue.add(postRequest);
}

解決策2

php を使用する場合、$_POST[''];
機能していない、彼女の詳細情報。

幸運を

于 2015-09-18T05:11:01.690 に答える