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