Http Post 带凌空请求

Http Post request with volley

我正在使用 volley 向服务器请求我有这个 url 我 post 我的 DeviceId,制造商,android 版本等我有一个 aeskey 和 aesiv base64 编码和授权密钥,然后到另一个 url 我将此授权密钥作为 header 发送,作为 body 我需要输入“句点(它可以是 = 'all' , 'increasing'、'decreasing' 等 )”,它由 aeskey 和 aesiv 使用带有填充 PKCS7 和 ECB 或 CBC 的 aes256 加密。但是我从第一个请求中得到了响应,但是从第二个请求中我得到了 http 400 错误,我不知道我做错了什么。我无权访问服务器,因此无法访问 headers 和参数,我只是添加我被告知的内容。我在想也许我做错了加密?

这就是我解码 base64 aeskey 和 aesiv 的方式

 key = response.getString("aesKey");
                    iv = response.getString("aesIV");
                    byte[] aeskey = Base64.decode(key, Base64.DEFAULT);
                    byte[] aesiv = Base64.decode(iv, Base64.DEFAULT);

这是我的第一个请求代码

public void getData(String url,String deviceID) throws JSONException {
        JSONObject datas = new JSONObject();
        datas.put("deviceID", deviceID);
        datas.put("systemVersion", Build.VERSION.SDK_INT);
        datas.put("platformName","Android");
        datas.put("deviceModel",Build.MODEL);
        datas.put("manifacturer",Build.MANUFACTURER);
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, datas, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                System.out.println(response);
                
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println(error.toString());
            }
        }){


            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

                Map<String,String> params = new HashMap<>();
                params.put("Content-Type", "application/json");

                return params;
            }
        };



        queue.getCache().clear();
        queue.add(req);

    }


这是我的加密方式


public static byte[] encrypt(String plainText, byte[] key, byte[] iv) throws Exception
    {

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);

        byte[] cipherText = cipher.doFinal(plainText.getBytes());
        return cipherText;
    }

这是我第二次请求的第二种方法


public void getanotherdata(String url, String period, final String auth) throws JSONException {
        JSONObject datas1 = new JSONObject();
        datas1.put("period", period);
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, datas1, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {

                try {
                    System.out.println(response.toString());
                    System.out.println("burası çalıştı");
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println(e.toString());
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println(error.toString());
            }
        }){


            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

                Map<String,String> params = new HashMap<>();
                params.put("Content-Type", "application/json");
                params.put("X-VP-Authorization", auth);
                System.out.println("AUTH DEĞERİ "+ auth);

                return params;
            }
        };



        queue.getCache().clear();
        queue.add(req);
    }


我有 2 个可能的答案

  1. 您可能面临 header 本身的编码问题,要在 RFC-2616 中验证关于 HTTP 标准,header field-name 必须是一个令牌由 1 个或多个 CHAR =
  2. 可能其中一个代理层(如 nginx 或类似层)在请求到达服务器之前“吃掉”了请求中的 header。也许您应该在发出 400 的接收服务器上验证它是否正确接收到包含身份验证信息的 header。