android - ভল্লি জসনঅবজেক্টউরেস্ট পোস্ট প্যারামিটারগুলি আর কাজ করে না




post android-volley (8)

আমি ভল্লি জসনঅবজেক্টরেখায় পোস্ট প্যারামিটারগুলি প্রেরণের চেষ্টা করছি। প্রাথমিকভাবে, এটি জাসনঅবজেক্টরেক্সেস্টের কনস্ট্রাক্টরের প্যারামিটারগুলি সহ একটি 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);

এখানে সার্ভারে সাধারণ পরীক্ষক পিএইচপি কোড রয়েছে:

$response = array("tag" => $_POST["tag"]);
echo json_encode($response);

আমি যে প্রতিক্রিয়া পেয়েছি তা হ'ল {"tag":null}
গতকাল, এটি দুর্দান্ত কাজ করেছে এবং {"tag":"test"} with দিয়ে সাড়া দিচ্ছিল
আমি একটি জিনিস পরিবর্তন করি নি, তবে আজ এটি আর কাজ করছে না।

ভল্লি সোর্স কোড কনস্ট্রাক্টর জাভাদোক-এ বলা হয়েছে যে আপনি "@param jsonRequest" এ পোস্ট প্যারামিটারগুলি প্রেরণ করতে কনস্ট্রাক্টরের একটি JSONObject পাস করতে পারেন: https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java

/ **
* একটি নতুন অনুরোধ তৈরি করে।
* @ পরিম পদ্ধতিটি HTTP পদ্ধতি ব্যবহার করতে হবে
* @ থেকে জেএসএন আনার জন্য ইউআরএল ইউআরএল
* @param jsonRequest A {@ লিঙ্ক জেএসএনওবজেক্ট the অনুরোধটি সহ পোস্ট করতে। নাল অনুমোদিত এবং
* অনুরোধ সহ কোনও পরামিতি পোস্ট করা হবে না তা নির্দেশ করে।

আমি অনুরূপ প্রশ্ন সহ অন্যান্য পোস্টগুলি পড়েছি, তবে সমাধানগুলি আমার পক্ষে কার্যকর হয়নি:

ভল্লি জসনঅজেক্টরেউকোস্ট পোস্টের অনুরোধটি কাজ করছে না

গেটহেডার এবং গেটপ্যারামগুলি ব্যবহার করার সময় ভল্লি পোস্ট জসনঅবজেক্টপ্রেমিটারগুলিকে উপেক্ষা করার অনুরোধ করুন

ভলি প্যারামিটার সহ কোনও পোস্টের অনুরোধ পাঠাচ্ছে না।

আমি JSONObject সেট করতে চেষ্টা করেছি JSONObjectRequest কনস্ট্রাক্টরকে বাতিল করতে, তারপরে "getParams ()", "getBody ()", এবং "getPostParams ()" পদ্ধতিতে পরামিতিগুলি ওভাররাইডিং এবং সেট করার চেষ্টা করেছি, কিন্তু এই ওভাররাইডগুলির কোনওটির জন্যই কাজ হয়নি has আমাকে. আরেকটি পরামর্শ ছিল অতিরিক্ত সাহায্যকারী শ্রেণি ব্যবহার করা যা মূলত একটি কাস্টম অনুরোধ তৈরি করে তবে আমার প্রয়োজনের জন্য এই সমাধানটি কিছুটা জটিল। যদি এটি এর উপরে আসে তবে আমি এটিকে কাজ করার জন্য কিছু করব, তবে আমি আশা করছি যে আমার কোডটি কেন কাজ করছে সে সম্পর্কে একটি সাধারণ কারণ রয়েছে এবং তারপরে কেবল বন্ধ হয়ে গেছে , এবং একটি সহজ সমাধানও।


... প্রাথমিকভাবে, এটি আমার জন্য কাজ করছিল .... তারপরে হঠাৎ করেই এটি কাজ করা বন্ধ করে দিয়েছে এবং আমি কোডটিতে কোনও পরিবর্তন করি নি

আপনি যদি পূর্ববর্তী ওয়ার্কিং কোডে কোনও পরিবর্তন না করে থাকেন তবে আমি অন্য প্যারামিটারগুলি যেমন ইউআরএল পরীক্ষা করার পরামর্শ দিচ্ছি, কারণ আপনি যদি নিজের কম্পিউটারটিকে সার্ভার হিসাবে ব্যবহার করেন তবে আইপি ঠিকানাটি পরিবর্তন হতে পারে!


আপনার পরামিতিগুলির হ্যাশম্যাপ থেকে আপনাকে কেবল একটি 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);

আপনি এটি এইভাবে করতে পারেন:

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

নীচে কাস্টমসুয়েস্ট অনুসারে লিঙ্ক ভল্লি জসনঅবজেক্টরেউকস্ট পোস্টের অনুরোধটি কাজ করছে না


আমারও অনুরূপ সমস্যা ছিল তবে আমি জানতে পেরেছিলাম যে সমস্যাটি ক্লায়েন্টের পক্ষের নয়, সার্ভারের দিকে। আপনি যখন JsonObject প্রেরণ JsonObject , আপনার পোস্টের অবজেক্টটি এই জাতীয় (সার্ভারের দিকে) পেতে হবে:

পিএইচপি-তে:

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

আমি পরিবর্তে ভলির স্ট্রিংয়েরউইকস্ট ব্যবহার করে শেষ করেছি, কারণ আমি জেসনঅবজেটরেইকস্টের কাজটি করার চেষ্টা করার জন্য অনেক বেশি মূল্যবান সময় ব্যবহার করছিলাম।

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

শুভকামনা! শুভ রাত্রি!


প্যারামিটারগুলি প্রেরণের জন্য JSONObject অবজেক্টটি ব্যবহার করা মানে প্যারামিটারগুলি HTTP পোষ্ট অনুরোধের বডিটিতে JSON ফর্ম্যাটে থাকবে:

Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
params.put("tag2", "test2");
JSONObject jsonObj = new JSONObject(params);

এই JSON অবজেক্টটি তৈরি করবে এবং এটি HTTP পোষ্ট অনুরোধের শরীরে প্রবেশ করবে:

{"tag":"test","tag2":"test2"}

তারপরে সার্ভারের এই পোস্ট পরামিতিগুলি বুঝতে JSON ডিকোড করতে হবে।

তবে সাধারণত এইচটিটিপি পোস্টের পরামিতিগুলি শরীরে লিখিত থাকে:

tag=test&tag2=test2

তবে এখনই প্রশ্নটি হল কেন ভোলি এইভাবে সেট করা আছে?

এইচটিটিপি পোস্ট পদ্ধতি পড়ার জন্য একটি সার্ভারকে স্ট্যান্ডার্ডভাবে JSON (প্লেইন পাঠ্য ব্যতীত) তেও প্যারামিটারগুলি পড়ার চেষ্টা করা উচিত এবং সুতরাং যে সার্ভারটি সম্পাদন করে না তা কি খারাপ সার্ভার?

বা পরিবর্তে জেএসএনে প্যারামিটার সহ একটি এইচটিটিপি পোস্ট বডি সাধারণত কোনও সার্ভার কী চায় না?


here উল্লিখিত কাস্টমজসনঅবজেক্টরউইয়েস্ট সহায়ক শ্রেণীর ব্যবহার 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);




jsonobject