【问题标题】:Volley request fails, if string's length is longVolley 请求失败,如果字符串的长度很长
【发布时间】:2019-04-03 20:37:45
【问题描述】:

我正在尝试使用 volley 发出多部分请求。当用户在编辑文本中输入的地址和标题的长度很小时,它可以完美地工作;但如果用户在编辑文本中输入更多文本,它将失败。

Volley Multipart Request 包含 curl url 形式的参数。我无法理解实际问题是什么。

final JSONObject jsonBody = new JSONObject();

        jsonBody.put("CategoryName", categories.get(categorySpinner.getSelectedItemPosition()).getCategoryName().replace(" ", "_"));
        jsonBody.put("SubCategoryName", subCategories.get(subCategorySpinner.getSelectedItemPosition()).replace(" ", "_"));
        jsonBody.put("City", "Rabwah");
        jsonBody.put("Address", etAddress.getText().toString());
        jsonBody.put("ProductTitle", etTitle.getText().toString());
        jsonBody.put("Description", etDescription.getText().toString());
        jsonBody.put("Price", Integer.parseInt(etPrice.getText().toString()));
        jsonBody.put("flgNegotiable", negotiableCheckBox.isChecked());
        jsonBody.put("flgUsed", usedCheckBox.isChecked());
        jsonBody.put("flgNew", newCheckBox.isChecked());
        jsonBody.put("ContactNumber", Integer.parseInt(etNumber.getText().toString()));
        jsonBody.put("UserID", preferences.getInt("id", 2));
        String url;
        if (adsModel != null) {
            jsonBody.put("ProductAddID", adsModel.getProductAddID());
            url = UrlConstants.updatepost + "?Json=" + jsonBody;

        } else {
            url = UrlConstants.submitAd + "?Json=" + jsonBody;
        }
        VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() {
            @Override
            public void onResponse(NetworkResponse response) {
                Log.d("onResponse: ", response.toString());
                try {
                    k.dismiss();
                } catch (Exception e) {
                }
                Toasty.success(context, "Ad Posted", Toast.LENGTH_SHORT).show();
                finish();

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {



                try {
                    k.dismiss();
                } catch (Exception e) {
                }
                Toasty.error(context, "some error occured", Toast.LENGTH_SHORT).show();

                error.printStackTrace();

            }
        }) {


            @Override
            protected Map<String, VolleyMultipartRequest.DataPart> getByteData() throws AuthFailureError {
                Map<String, DataPart> params = new HashMap<>();



                    params.put("file1", new DataPart("file_avatar.jpg", getbyte(resultUri1), "image/jpeg"));




                return params;
            }


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


        RequestQueue requestQueue = VolleySingleton.getInstance(context).getRequestQueue();

        requestQueue.add(multipartRequest);


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

请帮助我,我将非常感谢您

【问题讨论】:

    标签: android android-volley multipart


    【解决方案1】:

    试试这个

    在构建中:gradle

    implementation 'com.android.volley:volley:1.1.1'
    

    在 onCreate 方法中全局声明

    RequestQueue requestQueue;
    

    在 onCreate() 中:

    requestQueue = Volley.newRequestQueue(this);
    
    
    String url = "www.yourwebsite.com/example.php";
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                jsonParser(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(CreatePostQuery.this, "Error! Please try again later...", Toast.LENGTH_SHORT).show();
            }
        }) {
            protected Map<String, String> getParams() {
                Map<String, String> MyData = new HashMap<String, String>();
                MyData.put("userid", userid);
                MyData.put("posttext", posttext);
                MyData.put("email", email);
                return MyData;
            }
        };
        requestQueue.add(stringRequest);
    }
    
    public void jsonParser(String jsontext) {
        try {
            JSONObject emp = (new JSONObject(jsontext));
            String result = emp.getString("result");
            if (result.equals("successful")) {
                Toast.makeText(CreatePostQuery.this, "Post uploaded successfully", Toast.LENGTH_SHORT).show();
            }
            if (result.equals("error")) {
                Toast.makeText(CreatePostQuery.this, "Error! Please try again later...", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    

    【讨论】:

      【解决方案2】:

      看起来您正在将数据附加到 url 从而增加其长度。一些服务器对 url 的长度有限制,这可能是问题所在。既然您正在发出 POST 请求,为什么不将数据放在请求正文中,因为它可以处理大量数据。

      【讨论】:

      • 服务器就是这样设计的,可以在url中发送json
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多