Ошибка клиента при попытке сделать JsonObjectRequest с Android Volley - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь выполнить HTTP PUT с JSON для службы, которой требуется HTTP Basic Auth, но я продолжаю получать ошибки клиента.Я делаю это:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.PUT, payOp.getURL(), payOp.getJson(), new Response.Listener<JSONObject>() {
         @Override
         public void onResponse(JSONObject response) {
             Log.i("jsonObjectRequest", "Response " + response.toString());
         }
     }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {
             Log.i("jsonObjectRequest", "Error " + error.toString());
             Log.i("jsonObjectRequest", "Error ", error);
         }
     }){
         @Override
         public Map<String, String> getHeaders() throws AuthFailureError {
             HashMap<String, String> params = new HashMap<String, String>();

             ApplicationSettings applicationSettings = ApplicationSettings.getInstance();
             String username = applicationSettings.mMID;
             String password = applicationSettings.mAPIPassword;

             String creds = String.format("%s:%s",username, password);
             String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
             Log.i("jsonObjectRequest","Authorization is: " + auth);
             params.put("Authorization", auth);
             return params;
         }
     };

     queue.add(jsonObjectRequest);

И я возвращаюсь:

2019-05-04 17:52:40.158 7430-7430/com.amex.gatewaydemotr5 I/jsonObjectRequest: Error 
    com.android.volley.ClientError
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:199)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)

Я не могу понять, что я делаю неправильно.Я делаю строку creds правильной (у меня есть другое приложение, написанное в node.js, которое работает для сравнения выходных данных), но я не получаю много выходных данных из Volley за ошибку.Кто-нибудь может увидеть, что я делаю не так?Есть ли какой-нибудь способ получить более подробное описание ошибки?Спасибо!

1 Ответ

0 голосов
/ 05 мая 2019

Хорошо, разобрался.Это была проблема с моими URL и данными, но главное, что я не понимал, как анализировать ошибки, для тех, кому нужно знать, что есть объект networkResponse для ошибки, который имеет statusCode и параметры данных.Сообщения сервера есть.Параметр data возвращается в виде байтового массива, поэтому вы должны обернуть его в строковый объект, чтобы увидеть результаты.

Как только я понял, что могу вернуть нужные мне сообщения и решить проблему, вот код:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.PUT, payOp.getURL(), payOp.getJson(), new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Log.i("jsonObjectRequest", "Response " + response.toString());
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.i("jsonObjectRequest", "Error, Status Code " + error.networkResponse.statusCode);
        Log.i("jsonObjectRequest", "URL: " + payOp.getURL());
        Log.i("jsonObjectRequest", "Payload: " + payOp.getJson().toString());
        Log.i("jsonObjectRequest", "Net Response to String: " + error.networkResponse.toString());
        Log.i("jsonObjectRequest", "Error bytes: " + new String(error.networkResponse.data));

    }
}){
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> params = new HashMap<String, String>();

        ApplicationSettings applicationSettings = ApplicationSettings.getInstance();
        String username = applicationSettings.mMID;
        String password = applicationSettings.mAPIPassword;

        String creds = String.format("%s:%s",username, password);
        String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
        Log.i("jsonObjectRequest","Authorization is: " + auth);
        params.put("Authorization", auth);
        return params;
    }
};

Важная часть такова:

new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
    Log.i("jsonObjectRequest", "Error, Status Code " + error.networkResponse.statusCode);
    Log.i("jsonObjectRequest", "URL: " + payOp.getURL());
    Log.i("jsonObjectRequest", "Payload: " + payOp.getJson().toString());
    Log.i("jsonObjectRequest", "Net Response to String: " + error.networkResponse.toString());
    Log.i("jsonObjectRequest", "Error bytes: " + new String(error.networkResponse.data));

}
...