【问题标题】:Pass a JsonObject in Volley as POST parameter在 Volley 中传递一个 JsonObject 作为 POST 参数
【发布时间】:2017-08-24 03:06:07
【问题描述】:

我有一个 API 端点,需要在 POST 请求中将参数作为 JsonObject 发送。

我将得到的响应不是 Json,而是一个小的 CSV 字符串。

代码是

stringRequest = new StringRequest(Request.Method.GET, "http://apitest.eezyrent.com/api/userauthentication/SignUp",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        // Display the first 500 characters of the response string.
                        Toast.makeText(getApplication(), response.toString(), Toast.LENGTH_SHORT).show();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplication(), error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }) {

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> jsonParams2 = new HashMap<String, String>();
                jsonParams2.put("vcFName", firstname.getText().toString());
                jsonParams2.put("vcLname", lastname.getText().toString());
                jsonParams2.put("vcMobileNo", phone_no.getText().toString());
                jsonParams2.put("vcGender", gender_short);
                jsonParams2.put("vcEmailAddress", email.getText().toString());
                jsonParams2.put("vcPassword", password.getText().toString());
                jsonParams2.put("vcFBID", "");
                jsonParams2.put("intLoginUserID", "");
                jsonParams2.put("SignUpFrom", "Web");
                jsonParams2.put("intloginid", "");
                jsonParams2.put("AlreadyRegister", "");
                return jsonParams2;
            }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json");
            headers.put( "charset", "utf-8");
            return headers;
        }
    };

上面的代码很大程度上受到了来自这个社区的回答的启发,但这似乎并不能解决我的问题。

我收到 Volley 错误 405。

 E/Volley﹕ [112549] BasicNetwork.performRequest: Unexpected response code 405 for http://myurl

事实上,如果我使用 AsyncTask 而不是 Volley,使用相同的 json 作为参数和相同的端点 url。有用!! AsyncTask 代码是从这个问题中找到的。 Java HttpClient changing content-type?

但我想使用 Volley,有什么办法可以解决这个问题?

示例 JSON 对象

{"vcFName":"Ron","vcLname":"Weasley","vcMobileNo":"555888999","vcGender":"M","vcEmailAddress":"someone@somewhere.com","vcPassword":"123456","vcFBID":"","intLoginUserID":'',"SignUpFrom":"Web","intloginid":"","AlreadyRegister":""}

【问题讨论】:

  • 你可以让JsonObjectRequest 看到这个androidhive.info/2014/09/android-json-parsing-using-volley
  • @KaranMer 我已经尝试过了,我得到了同样的错误。 JsonObjectRequest 对我也没有用,因为响应是 CSV 字符串而不是 JSON 字符串。
  • 在这种情况下,您需要提出自定义请求,请参阅此 SO 线程 stackoverflow.com/questions/30859044/…
  • @KaranMer 但同样,该助手类是用于 JsonArrayRequest 而不是 StringRequest。你能修改那个助手类吗,因为我不明白。

标签: android


【解决方案1】:

您需要使用 JsonObjectRequest 类。在 JsonObjectRequest 类的第三个参数中将您的参数作为 json 对象传递。下面是一个小sn-p:

 Map<String, String> jsonParams2 = new HashMap<String, String>();
            jsonParams2.put("vcFName", firstname.getText().toString());
            jsonParams2.put("vcLname", lastname.getText().toString());
            jsonParams2.put("vcMobileNo", phone_no.getText().toString());
            jsonParams2.put("vcGender", gender_short);
            jsonParams2.put("vcEmailAddress", email.getText().toString());
            jsonParams2.put("vcPassword", password.getText().toString());
            jsonParams2.put("vcFBID", "");
            jsonParams2.put("intLoginUserID", "");
            jsonParams2.put("SignUpFrom", "Web");
            jsonParams2.put("intloginid", "");
            jsonParams2.put("AlreadyRegister", "");

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
        YourUrl, new JsonObject(jsonParams2),
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }) {
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put("Content-Type", "application/json");
        headers.put( "charset", "utf-8");
        return headers;
    }
};

【讨论】:

  • 当我回复@KaranMer 时,我已经尝试过了。并发现了同样的错误。谢谢!
【解决方案2】:

第 1 步:使模型类可解析/可序列化。
第 2 步:覆盖模型类中的 toString()。
第 3 步: Map<String,JSONObject> params = new HashMap<>(); JSONObject object = null; try{ object = new JSONObject(classObject.toString()); }catch (Exception e){ } params.put("key", object); JSONObject objectParams = new JSONObject(params);
第 4 步:使用 volley JSONObject 请求发送 objectParams。
完成!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多