#java #android #http #android-volley #bad-request
#java #Android #http #android-volley #неверный запрос
Вопрос:
я использую volley для запроса на сервер, у меня есть этот URL-адрес, по которому я отправляю свой DeviceID, производителя, версию Android и т.д., И я получил aeskey и aesiv в кодировке base64 и ключ авторизации, поэтому затем на другой URL-адрес я отправил этот ключ авторизации в виде заголовка, а в качестве тела мне нужно поставить «точка (это может быть = ‘all’, ‘increasing’, ‘reducing’ и т.д.)», Который зашифрован aeskey и aesiv с помощью aes256 с дополнением PKCS7 и ECB или Си-би-си. Но я получаю ответ от первого запроса, но из второго запроса я получил ошибку http 400, я не знаю, что я делаю не так. У меня нет доступа к серверу, поэтому к заголовкам и параметрам я просто добавляю то, что мне сказали. Я думаю, может быть, я неправильно использую шифрование?
вот как я декодирую 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);
}
Ответ №1:
У меня есть 2 возможных ответа
- Возможно, вы столкнулись с проблемой кодирования самого заголовка, для проверки в RFC-2616 о стандарте HTTP, имя поля заголовка должно быть токеном, состоящим из 1 или более символов CHAR = <любой символ US-ASCII (октеты 0 — 127)>
- Возможно, один из прокси-уровней (например, nginx или аналогичный) «съедает» заголовок из запросов до того, как он попадает на сервер. Возможно, вам следует проверить на принимающем сервере, который отправляет 400, что он правильно получает заголовок, содержащий информацию аутентификации.
Комментарии:
1. итак, если первая из них — моя проблема, я ничего не могу сделать? поскольку я не могу получить доступ к серверу, и если проблема во втором, как я могу убедиться, что сервер получает правильные данные
2. Если это результат Base64, который вы вводите в качестве значения для имени поля X-VP-Authorization, он будет соответствовать us-ascii. Теперь, если сервер на другом конце не может прочитать отправляемый вами заголовок, это может быть их проблемой, которую нужно исправить, или, возможно, они прочитали его, но не могут проверить. Есть ли какая-нибудь документация по api для чтения, чтобы мы могли видеть, правильно ли вы вычисляете?
3. к сожалению, у меня также нет никаких документов, но я нашел решение, по-видимому, мне пришлось отправить зашифрованные данные «period» в кодировке base64, поэтому после того, как я это сделаю, я получу правильный ответ, вы вдохновили меня, большое спасибо.