【问题标题】:Send post data to server using Volley android使用 Volley android 将发布数据发送到服务器
【发布时间】:2019-12-19 07:11:48
【问题描述】:

我正在尝试使用 Volley 库向服务器发送一些数据。

   private void registerUser(final String email, final String username,
                          final String password) {
    // Tag used to cancel the request
    String tag_string_req = "req_register";

    pDialog.setMessage("Registering ...");


    StringRequest strReq = new StringRequest(Method.POST,
            AppConfig.URL_REGISTER, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d(TAG, "Register Response: " + response.toString());


            try {
                JSONObject jObj = new JSONObject(response);
              //  String status = jObj.getString("status");

                    // User successfully stored in MySQL
                    // Now store the user in sqlite

                    String name = jObj.getString("username");
                    String email = jObj.getString("email");
                    String password = jObj.getString("password");
                   // String created_at = user
                            //.getString("created_at");

                    // Inserting row in users table
                   // db.addUser(name, email);

                    // Launch login activity
                    Intent intent = new Intent(
                            RegisterActivity.this,
                            LoginActivity.class);
                    startActivity(intent);
                    finish();


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

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Registration Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_LONG).show();

        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting params to register url
            Map<String, String> params = new HashMap<String, String>();


            params.put("email", email);
            params.put("username", username);
            params.put("password", password);

            return params;
        }

不幸的是没有 json 被发送,我什么也没得到。这是我的 logcat 输出示例。成功向服务器发送请求后,我想获得成功/失败的响应。

Register Response: ---- YOUR DATA ----
username=xxx&email=xxx%40gmail.com&password=xxxx&-------------------
05-05 14:56:55.002    2558-2558/app.victory.walking.thewalkingviktory   
W/System.err﹕ org.json.JSONException: Value ---- of type java.lang.String   
cannot be converted to JSONObject
05-05 14:56:55.002    2558-2558/app.victory.walking.thewalkingviktory   
W/System.err﹕ at org.json.JSON.typeMismatch(JSON.java:111)
05-05 14:56:55.002    2558-2558/app.victory.walking.thewalkingviktory   
W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:160)
05-05 14:56:55.002    2558-2558/app.victory.walking.thewalkingviktory   
W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:173)

有什么帮助吗?谢谢。

【问题讨论】:

  • 您希望以哪种格式发送参数,即 JSON 或字符串

标签: android post android-volley


【解决方案1】:
 private void postUsingVolley() {
    String tag_json_obj = "json_obj_req";

    final ProgressDialog pDialog = new ProgressDialog(this);
    pDialog.setMessage("posting...");
    pDialog.show();

    final String mVendorId = DeviceDetails.getInstance(mContext).getVendor_id();
    String mUserId = UserModel.getInstance(mContext).getUser_id();

    final HashMap<String, String> postParams = new HashMap<String, String>();
    sendFeedbackParams.put("key1", value1);
    sendFeedbackParams.put("key2", value2);
    sendFeedbackParams.put("key3", value3);

    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
            ApplicationData.POST_URL, new JSONObject(postParams),
            new com.android.volley.Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    //Log.d("TAG", response.toString());
                    try {
                        //Toast.makeText(mContext, response.getString("message"), Toast.LENGTH_LONG).show();
                        Toast.makeText(mContext, "Thank you for your post", Toast.LENGTH_LONG).show();

                        if (response.getBoolean("status")) {
                            pDialog.dismiss();
                            finish();
                        }
                    } catch (JSONException e) {
                        Log.e("TAG", e.toString());
                    }
                    pDialog.dismiss();
                }
            }, new com.android.volley.Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            //VolleyLog.d("TAG", "Error: " + error.getMessage());
            pDialog.dismiss();
            if (isNetworkProblem(error)) {
                Toast.makeText(mContext, "Internet Problem", Toast.LENGTH_SHORT).show();

            }
        }
    }) {

        @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return getRequestHeaders();
        }
    };

    jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(8000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
}

像这样使用 Volley,...它对我有用。

【讨论】:

  • 他使用的不是JsonObjectRequest而是StringRequest
  • 如果我想发送一个字符串参数和一个 int 怎么办?
  • final HashMap postParams = new HashMap(); ...使用这个...它将适用于所有组合
  • 不需要设置body type ? @Override public String getBodyContentType() { return "application/json; charset=utf-8"; }
【解决方案2】:

首先,您没有将 json 发送到您的服务器。您正在使用 post 方法发送参数化 url 并获取 json 文本作为响应。

我认为问题出在服务器的响应应该是 json。但是从您的日志中,您从 Log.d(TAG, "Register Response: " + response.toString()); 获得的此文本 "---- YOUR DATA ----" 根本不是 json formatted 。所以你需要修改你的服务器以正确的 json 格式响应。

【讨论】:

  • 我认为 Volley 库在使用 HashMap 中添加参数后会为您进行 Json 解析。
  • 好的。这是我的逻辑。我将java对象(电子邮件等)序列化为json字符串。这些字符串应该在服务器中输入,并获得相应的响应,如注册成功等,对吗?
  • 没有。您对服务器的请求与 json 无关。它只是将参数及其值映射到键值对中。如果您查看日志,username=xxx&amp;email=xxx%40gmail.com&amp;password=xxxx 这一行会显示您的请求的样子。但是,您可以将服务器设置为发送 json 作为 Volley 可以使用其内置方法处理的响应。
  • 所以你暗示这是一个服务器问题。我这么说是因为我没有做任何服务器编码,而是另一个人在工作。
  • 我可以说响应不是 json 格式的。不知道是服务器成功处理了请求还是你得到的响应对应的是成功还是失败。
【解决方案3】:

这就是解决方案。我不得不使用 JsonObjectRequest 类而不是 StringRequest 。 JsonRequest 所做的是将您的 HashMap 键值对转换为 JSON 格式。

    private void registerUser(String email_address,String username, String 
    password) {
    String tag_json_obj = "json_obj_req";

    final ProgressDialog pDialog = new ProgressDialog(this);
    pDialog.setMessage("posting...");
    pDialog.show();

    final String mVendorId = 
     DeviceDetails.getInstance(mContext).getVendor_id();
     String mUserId = UserModel.getInstance(mContext).getUser_id();
    String location = getResources().getConfiguration().locale.getCountry();
    final HashMap<String, String> postParams = new HashMap<String, String>  
    ();
    postParams.put("username", username);
    postParams.put("email", email_address);
    postParams.put("password", password);
    postParams.put("location", location);



    Response.Listener<JSONObject>  listener;
    Response.ErrorListener errorListener;
    final JSONObject jsonObject = new JSONObject(postParams);

    JsonObjectRequest jsonObjReq = new 
    JsonObjectRequest(AppConfig.URL_REGISTER, jsonObject,
            new com.android.volley.Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    //Log.d("TAG", response.toString());
                    try {
                        Toast.makeText(getApplicationContext(), 
       response.getString("message"), Toast.LENGTH_LONG).show();
                        // Toast.makeText(getApplicationContext(), "Thank 
       you for your post", Toast.LENGTH_LONG).show();

                        if (response.getString("status").equals("success")){


                            session.setLogin(true);


                            pDialog.dismiss();
                           Intent i = new 
        Intent(RegisterActivity.this,Welcome.class);
                           startActivity(i);

                            finish();
                        }
                    } catch (JSONException e) {
                        Log.e("TAG", e.toString());
                    }
                    pDialog.dismiss();
                }
            }, new com.android.volley.Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            //VolleyLog.d("TAG", "Error: " + error.getMessage());
            pDialog.dismiss();

        }
    }) {

        @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }


    };


    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);



  }

【讨论】:

    【解决方案4】:

    JSON 帖子

    public void makePostUsingVolley() 
    {
      session = new SessionManager(getActivity().getApplicationContext());
      session.checkLogin();
      HashMap<String, String> user = session.getUserDetails();
    
      final String  token = user.get(SessionManager.KEY_NAME);
    
      //Toast.makeText(getActivity().getApplicationContext(),name, Toast.LENGTH_SHORT).show();
    
      final Map<String, String> params = new HashMap<String, String>();
      //params.put("Employees",name);
      String tag_json_obj = "json_obj_req";
      String url = "enter your url";
    
      final ProgressDialog pDialog = new ProgressDialog(getApplicationContext());
      pDialog.setMessage("Loading...");
      pDialog.show();
    
     StringRequest req = new StringRequest(Request.Method.GET,url,
              new Response.Listener<String>() {
                  // final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
                  //"http://emservices.azurewebsites.net/Employee.asmx/CheckUserGet", new Response.Listener<JSONObject>() {
    
                  @Override
                  public void onResponse(String response) {
    
                      JSONObject json;
                         // Toast.makeText(getActivity().getApplicationContext(),"dfgghfhfgjhgjghjuhj", Toast.LENGTH_SHORT).show();
    
    
    
                        //Toast.makeText(getActivity().getApplicationContext(),obb.length(), Toast.LENGTH_SHORT).show();
    
    
    
                      // JSONObject data=obj.getJSONObject("Employee_Name");
                      ObjectOutput out = null;
                      try {
    
                          json = new JSONObject(response);
    
                      } catch (IOException e) {
                          e.printStackTrace();
                      } catch (JSONException e) {
                          e.printStackTrace();
                      }
    
    
    
    
                      pDialog.hide();
                      // Toast.makeText(getApplicationContext(),"hi", Toast.LENGTH_SHORT).show();
                      Log.d("", response);
    
    
                  }
              }, new Response.ErrorListener() {
    
          @Override
          public void onErrorResponse(VolleyError error) {
              VolleyLog.d("", "Error: " + error.getMessage());
              Toast.makeText(getActivity().getApplicationContext(),
                      error.getMessage(), Toast.LENGTH_SHORT).show();
              pDialog.hide();
              // hide the progress dialog
    
          }
      }) {
         @Override
           protected Map<String, String> getParams() {
         Map<String, String> params = new HashMap<String, String>();
         params.put("username",name);
         params.put("password",password);
    
         return params;
     }
    
      };
    
      // Adding request to request queue
      AppController.getInstance().addToRequestQueue(req, tag_json_obj);
    }
    

    【讨论】:

      【解决方案5】:
      requestQueue= Volley.newRequestQueue(MainActivity.this);
      StringRequest request=new StringRequest(Request.Method.PUT, url, new Response.Listener<String>() {
          @Override
          public void onResponse(String response) {
              Toast.makeText(MainActivity.this, ""+response, Toast.LENGTH_SHORT).show();
              Log.d("response",response);
          }
      }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
      
          }
      }){
          @Override
          protected Map<String, String> getParams() throws AuthFailureError {
              JSONObject jsonObject = new JSONObject();
              try {
                  jsonObject.put("name", name.getText().toString().trim());
                  jsonObject.put("email", email.getText().toString().trim());
                  jsonObject.put("phone", phone.getText().toString().trim());
              } catch (JSONException e) {
                  e.printStackTrace();
              }
      
              Map<String, String> params = new HashMap<String, String>();
              params.put("message", jsonObject.toString());
      
              return params;
          }
          };
      requestQueue.add(request);
      

      [["deep","dee@gmail.com","8888999999"]]

      【讨论】:

      • 不鼓励使用纯代码的答案。请编辑您的答案并解释您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多