programing

Bolley Json Object Request Post 매개 변수가 더 이상 작동하지 않습니다.

bestprogram 2023. 3. 23. 23:16

Bolley Json Object Request Post 매개 변수가 더 이상 작동하지 않습니다.

Balley Json Object Request에서 POST 파라미터를 전송하려고 합니다.처음에는 JsonObjectRequest의 컨스트럭터 내의 파라미터를 포함한 JSONObject를 전달하기 위해 공식 코드에 나와 있는 대로 동작했습니다.그런데 갑자기 작동이 중단되었고 이전에 작동하던 코드를 변경하지 않았습니다.서버는 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"}
하나도 안 바꿨는데 오늘은 안 되네.

Bolley 소스 코드 컨스트럭터 javadoc에서는 컨스트럭터에서 JSONObject를 전달하여 "@param jsonRequest"로 포스트 파라미터를 전송할 수 있다고 합니다.https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java

/**
* 새 요청을 만듭니다.
* @param 메서드 사용HTTP 메서드
* JSON을 가져오는 @param URL
* @param jsonRequest A {@link JSONObject} 요청과 함께 게시합니다.Null은 허용되며
*는 요청과 함께 파라미터가 게시되지 않음을 나타냅니다.

비슷한 질문을 한 다른 게시물을 읽었지만 해결 방법이 효과가 없었습니다.

Balley Json Object Request Post 요청이 작동하지 않습니다.

getHeader 및 getParams를 사용하는 동안 Bolley Post JsonObjectRequest가 매개 변수를 무시함

매개 변수를 사용하여 게시 요청을 전송하지 않았습니다.

JsonObjectRequest 컨스트럭터에서 JSONObject를 null로 설정한 후 "getParams()", "getBody() 및 "getPostParams()" 메서드에서 파라미터를 덮어쓰고 설정하려고 시도했지만 이러한 덮어쓰기 중 어느 것도 작동하지 않았습니다.또 다른 제안으로는 기본적으로 커스텀 요청을 작성하는 추가 도우미 클래스를 사용하는 것이었는데, 이 수정은 제 요구에는 너무 복잡합니다.결론적으로 말하면, 나는 그것을 작동시키기 위해 무슨 일이든 할 것입니다만, 나는 내 코드가 작동하다가 멈춘 단순한 이유와 간단한 해결책이 있기를 바랍니다.

파라미터의 해시맵에서 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);

Json Object Request를 작동시키기 위해 귀중한 시간을 너무 많이 소비했기 때문에 Balley의 String Request를 사용하게 되었습니다.

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와 마찬가지로 단순하지만 대신 문자열을 사용합니다.

저도 같은 문제가 있었습니다만, 문제가 클라이언트측에서 발생한 것이 아니라 서버측에서 발생한 것을 알게 되었습니다.「 」를 할 때JsonObject서버측에서 다음과 같은 POST 오브젝트를 취득할 필요가 있습니다.

PHP의 경우:

$json = json_decode(file_get_contents('php://input'), true);

StringRequest를 사용하여 JsonObjectRequest와 동일한 작업을 수행하면서도 POST 파라미터를 쉽게 전송할 수 있습니다.당신이 해야 할 일은 당신이 받은 요청 String에서 Json Object를 작성하는 것뿐입니다.그것에서 Json Object Request와 같이 계속할 수 있습니다.

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

여기서 설명하는 CustomJsonObjectRequest 도우미 클래스를 사용합니다.

다음과 같이 구현합니다.

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

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"}

그런 다음 서버는 이러한 POST 파라미터를 이해하기 위해 JSON을 디코딩해야 합니다.

단, 보통 HTTP POST 파라미터는 다음과 같이 본문에 기술됩니다.

tag=test&tag2=test2

하지만 여기서 문제는 왜 발리가 이런 방식으로 설정되느냐는 것이다.

HTTP POST 메서드를 읽는 서버는 표준으로 항상 JSON(일반 텍스트 이외)에서도 파라미터를 읽으려고 합니다.따라서 실행하지 않는 서버는 불량 서버입니까?

또는 JSON에 파라미터를 포함한 HTTP POST 본문이 서버가 통상 필요로 하는 것이 아닐까요?

누군가에게 도움이 되고 생각할 시간을 절약할 수 있을 거야비슷한 문제가 있었는데 서버 코드가 Content-Type 헤더를 찾고 있었습니다.이 방법은 다음과 같습니다.

if($request->headers->content_type == 'application/json' ){ //Parse JSON... }

하지만 발리는 헤더를 이렇게 보냈다.

'application/json; charset?utf-8'

서버 코드를 이렇게 변경하면 문제가 해결되었습니다.

if( strpos($request->headers->content_type, 'application/json') ){ //Parse JSON... 

저도 비슷한 문제가 있었어요.그러나 서버 측에서 문제가 발생한 것이 아니라 캐시에서 문제가 발생한 것을 알게 되었습니다.RequestQueue 캐시를 클리어해야 합니다.

RequestQueue requestQueue1 = Volley.newRequestQueue(context);
requestQueue1.getCache().clear();

다음과 같이 할 수 있습니다.

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에 따라 Balley Json ObjectRequest Post 요청이 작동하지 않습니다.

과가가있있있있
합니다. - 부적처럼 작용합니다. - 마법처럼 작용합니다.

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

Balley for Json type request and response로 전화할 수 있게 되었습니다.

  public void callLogin(String sMethodToCall, String sUserId, String sPass) {
            RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                    Request.Method.POST, ConstantValues.ROOT_URL_LOCAL + sMethodToCall.toString().trim(), addJsonParams(sUserId, sPass),
    //                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("onResponse", response.toString());
                            Toast.makeText(VolleyMethods.this, response.toString(), Toast.LENGTH_LONG).show(); // Test

                            parseResponse(response);
    //                        msgResponse.setText(response.toString());
    //                        hideProgressDialog();
                        }
                    },
                    new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            VolleyLog.d("onErrorResponse", "Error: " + error.getMessage());
                            Toast.makeText(VolleyMethods.this, error.toString(), Toast.LENGTH_LONG).show();
    //                hideProgressDialog();
                        }
                    }) {

                /**
                 * Passing some request headers
                 */
                @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(jsonObjectRequest);
        }

        public JSONObject addJsonParams(String sUserId, String sPass) {
            JSONObject jsonobject = new JSONObject();
            try {
    //            {"id":,"login":"secretary","password":"password"}

                ///***//
                Log.d("addJsonParams", "addJsonParams");

    //            JSONObject jsonobject = new JSONObject();

    //            JSONObject jsonobject_one = new JSONObject();
    //
    //            jsonobject_one.put("type", "event_and_offer");
    //            jsonobject_one.put("devicetype", "I");
    //
    //            JSONObject jsonobject_TWO = new JSONObject();
    //            jsonobject_TWO.put("value", "event");
    //            JSONObject jsonobject = new JSONObject();
    //
    //            jsonobject.put("requestinfo", jsonobject_TWO);
    //            jsonobject.put("request", jsonobject_one);

                jsonobject.put("id", "");
                jsonobject.put("login", sUserId); // sUserId
                jsonobject.put("password", sPass); // sPass


    //            js.put("data", jsonobject.toString());

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return jsonobject;
        }

        public void parseResponse(JSONObject response) {

            Boolean bIsSuccess = false; // Write according to your logic this is demo.
            try {
                JSONObject jObject = new JSONObject(String.valueOf(response));
                bIsSuccess = jObject.getBoolean("success");


            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(VolleyMethods.this, "" + e.toString(), Toast.LENGTH_LONG).show(); // Test
            }

        }

파티에 늦지 않았기를 바랍니다.서버 측에서 문제가 발생.PHP를 사용하는 경우 php api 파일 상단에 다음 행을 추가합니다(이후 포함).

$inputJSON = file_get_contents('php://input');
if(get_magic_quotes_gpc())
{
    $param = stripslashes($inputJSON);
}
else
{
    $param = $inputJSON;
}

$input = json_decode($param, TRUE);

그런 다음 값을 가져옵니다.

$tag= $input['tag'];

Json Object Request를 사용하기 위해 POST 대신 GET 사용

VolleySingleton.getInstance()
                .add(new StringRequest(Request.Method.POST, urlToTest, new Response.Listener<String>() {
                         @Override
                         public void onResponse(String response) {
                             // do stuff...
                         }
                     }, new Response.ErrorListener() {
                         @Override
                         public void onErrorResponse(VolleyError error) {
                             // exception
                         }
                     }) {
                         @Override
                         public String getBodyContentType() {
                             return "application/x-www-form-urlencoded; charset=UTF-8";
                         }

                         @Override
                         protected Map<String, String> getParams() {
                             return ServerApi.getRequiredParamsRequest(context);
                         }

                     }
                );

...처음에는 효과가 있었지만…그런데 갑자기 작동이 멈췄고 코드를 변경하지 않았습니다.

이전에 동작하고 있던 코드에 변경을 가하지 않은 경우는, URL등의 다른 파라메타를 체크하는 것을 추천합니다.서버로서 자신의 컴퓨터를 사용하고 있는 경우, IP 주소가 변경될 수 있습니다.

언급URL : https://stackoverflow.com/questions/29442977/volley-jsonobjectrequest-post-parameters-no-longer-work