有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有标题和正文参数的java截击请求

我需要发出一个api请求

两个标题:

  1. 接受

  2. 授权

五个身体参数

  1. 号码
  2. 制造
  3. 模型
  4. 描述
  5. 盘子

通过邮递员,一切都很顺利。 但当我尝试通过安卓应用程序时,我无法通过。 注意:通过同一个主机登录效果很好,所以设置不是问题,我想我的主要问题是api调用

public void add(View view) {
        RequestQueue queue = Volley.newRequestQueue(this);
        String URL = "http://10.0.2.2:8000/api/trucks";
        StringRequest request = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonObj = new JSONObject(response);
                            // parse response
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        NetworkResponse response = error.networkResponse;
                        String errorMsg = "";
                        if (response != null && response.data != null) {
                            String errorString = new String(response.data);
                        }
                    }
                }
        ) {

            @Override
            public Map<String, String> getHeaders() {
                HashMap<String, String> headers = new HashMap<>();
                headers.put("Accept", "application/json");
                headers.put("Authorization", "Bearer " + myToken);
                return headers;
            }

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                TextInputEditText number = findViewById(R.id.textInputEditTextNumber);
                TextInputEditText make = findViewById(R.id.textInputEditTextMake);
                TextInputEditText model = findViewById(R.id.textInputEditTextModel);
                TextInputEditText description = findViewById(R.id.textInputEditTextDescription);
                TextInputEditText plates = findViewById(R.id.textInputEditTextPlates);

                params.put("number", number.getText().toString());
                params.put("make", make.getText().toString());
                params.put("model", model.getText().toString());
                params.put("description", description.getText().toString());
                params.put("plates", plates.getText().toString());
                return params;
            }
        };
        queue.add(request);
    }

编辑:按解决方案#1

public void add(View view) throws JSONException {
    RequestQueue queue = Volley.newRequestQueue(this);
    TextInputEditText number = findViewById(R.id.textInputEditTextNumber);
    TextInputEditText make = findViewById(R.id.textInputEditTextMake);
    TextInputEditText model = findViewById(R.id.textInputEditTextModel);
    TextInputEditText description = findViewById(R.id.textInputEditTextDescription);
    TextInputEditText plates = findViewById(R.id.textInputEditTextPlates);

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("Number", number.getText().toString());
    jsonObject.put("Make", make.getText().toString());
    jsonObject.put("Model", model.getText().toString());
    jsonObject.put("Description", description.getText().toString());
    jsonObject.put("Plates", plates.getText().toString());
    final String requestBody = jsonObject.toString();

    JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, "http://10.0.2.2:8000/api/trucks", jsonObject,
            new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

            //now handle the response
            Toast.makeText(truck_add.this, response.toString(), Toast.LENGTH_SHORT).show();

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

            //handle the error
            Toast.makeText(truck_add.this, "An error occurred", Toast.LENGTH_SHORT).show();
            error.printStackTrace();
        }
    }) {    //this is the part, that adds the header to the request
        @Override
        public Map<String, String> getHeaders() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Accept", "application/json");
            params.put("Authorization", myToken);
            return params;
        }
    };
    queue.add(jsonRequest);
}

邮递员:Postman example


共 (2) 个答案

  1. # 1 楼答案

    当您希望通过主体传递数据时,需要在字符串请求之前创建一个json对象
    这样试试,
    1.为请求创建字符串url
    2.为body数据创建json对象并将数据传递给它。比如

    JSONObject jsonObject= new JSONObject();  
    jsonObject.put("Number", address.getNumber());  
    jsonObject.put("Make", address.getMake());  
    jsonObject.put("Model", address.getModel());  
    jsonObject.put("Description", address.getDescription());  
    jsonObject.put("Plates", address.getPlates());  
    final String requestBody=jsonObject.toString();  
    

    三,。在此之后,应用stringRequest
    4.现在,在header方法和after error方法之前添加以下行

    @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }
    
            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return requestBody == null ? null : requestBody.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                    return null;
                }  
    

    五,。在getHeaders()方法中,对“application/json”使用内容类型,对于授权,必须只使用不带(Bearer)的令牌
    完成了

  2. # 2 楼答案

    public void add(View view) throws JSONException {
       String URL = "http://10.0.2.2:8000/api/trucks";
    
       //removed views initialization from here.  
    //you need to initialize views in oncreate() / oncreateView() method.  
    /*first create json object in here.
    then set keys as per required body format with values
    */
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("Number", number.getText().toString());
        jsonObject.put("Make", make.getText().toString());
        jsonObject.put("Model", model.getText().toString());
        jsonObject.put("Description", description.getText().toString());
        jsonObject.put("Plates", plates.getText().toString());
        final String requestBody = jsonObject.toString();
    
     RequestQueue queue = Volley.newRequestQueue(this);
    
        StringRequest request = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONObject jsonObj = new JSONObject(response);
                            // parse response
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        NetworkResponse response = error.networkResponse;
                        String errorMsg = "";
                        if (response != null && response.data != null) {
                            String errorString = new String(response.data);
                        }
                    }
                }
        )  {    //this is the part, that adds the header to the request
    //this is where you need to add the body related methods
    @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }
    
        @Override
        public byte[] getBody() throws AuthFailureError {
            try {
                return requestBody == null ? null : requestBody.getBytes("utf-8");
            } catch (UnsupportedEncodingException uee) {
                VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s 
    using %s", requestBody, "utf-8");
                return null;
            } 
            @Override
            public Map<String, String> getHeaders() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Content-Type", "application/json");
                params.put("Authorization", myToken);
                return params;
            }
        };
        queue.add(jsonRequest);
    }  
    

    在每个方法中输入日志,检查正在执行的方法以及可能的错误
    如果在此之后出现错误,那么从logcat发布错误,我们将快速解决它