2016-04-05 4 views
6

Я работаю с Volley, я хочу сделать запрос серверу, который возвращает мне JSON в «допустимый уровень» (я вижу его в веб-браузере). Моя проблема заключается в том, что сервер также возвращает мои данные заголовков, которые мне нужно получить в моем приложении, но я не могу получить заголовки из запроса.Получение заголовков от ответа в volley

Я искал долго, но я гавань нашел ничего полезного (Onlye добавления данных в заголовок запроса, но не получает данные из ответа header's)

Каждых знает, как осуществить это?

ответ

12

К получите заголовки, которые вам нужно переопределить parseNetworkResponse в вашем запросе.

например JsonObjectRequest:

public class MetaRequest extends JsonObjectRequest { 

    public MetaRequest(int method, String url, JSONObject jsonRequest, Response.Listener 
      <JSONObject> listener, Response.ErrorListener errorListener) { 
     super(method, url, jsonRequest, listener, errorListener); 
    } 

    public MetaRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject> 
      listener, Response.ErrorListener errorListener) { 
     super(url, jsonRequest, listener, errorListener); 
    } 

    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, 
        HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 
      JSONObject jsonResponse = new JSONObject(jsonString); 
      jsonResponse.put("headers", new JSONObject(response.headers)); 
      return Response.success(jsonResponse, 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 
} 
+0

Спасибо! Оно работает!! Я делаю свою работу в заголовках в parseNetworkResponse вместо добавления заголовков в возвращаемый JSONObject. – Chopi

1

если запрос возвращает JSON, вы должны быть в состоянии прочитать это нормально, если не проблема с JSON не из Android App

вот пример запроса обработки

RequestQueue queue = Volley.newRequestQueue(MainActivity.this); 
    JsonArrayRequest getRequest = new JsonArrayRequest(Request.Method.GET, "http://yourlink+parameters", new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 
      List<YourObject> reservations = null; 
      try { 

       YourObject= new ArrayList<YourObject>(); 
       for (int i = 0; i < response.length(); i++) { 
        JSONObject obj = response.getJSONObject(i); 
        YourObjectr = new YourObject(obj.getInt("id"), obj.getInt("user_id"),format.parse(obj.getString("date")), obj.getString("address"), obj.getString("description")); 
         } 

        } catch (ParseException e) { 
         e.printStackTrace(); 
        } 

       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError volleyError) { 
      if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) { 
       VolleyError error = new VolleyError(new String(volleyError.networkResponse.data)); 
       volleyError = error; 
       Log.i("error", "error :" + volleyError.getMessage()); 
       try { 
        JSONObject obj = new JSONObject(volleyError.getMessage()); 
        if (obj.getString("error").equals("token_expired")) { 
         Intent i = new Intent(MainActivity.this, LoginActivity.class); 
         startActivity(i); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } else { 
       new AlertDialog.Builder(MainActivity.this) 
         .setTitle("connection problem") 
         .setMessage("check your connection") 
         .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
          } 
         }) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .show(); 
      } 
     } 
    }); 

    queue.add(getRequest); 
+2

С помощью JsonArrayRequest вы не можете получить информацию о заголовках (например, cookie) http-запроса. – Chopi

0

Это пример для работы с данными и заголовками JSONArray.

Сначала создайте собственную реализацию типа пользовательского запроса:

public class JsonRequest extends JsonObjectRequest { 

    public JsonRequest(int method, String url, JSONObject jsonRequest, Response.Listener 
      <JSONObject> listener, Response.ErrorListener errorListener) { 
     super(method, url, jsonRequest, listener, errorListener); 
    } 

    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, 
        HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 

      JSONObject jsonResponse = new JSONObject(); 
      jsonResponse.put("data", new JSONArray(jsonString)); 
      jsonResponse.put("headers", new JSONObject(response.headers)); 

      return Response.success(jsonResponse, 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 
} 

и код запроса:

JsonRequest request = new JsonRequest 
     (Request.Method.POST, URL_API, payload, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       try { 
        JSONArray data = response.getJSONArray("data"); 
        JSONObject headers = response.getJSONObject("headers"); 
       } catch (JSONException e) { 
        Log.e(LOG_TAG, Log.getStackTraceString(e)); 
       } 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e(LOG_TAG, Log.getStackTraceString(error)); 
      } 
     }); 

Посмотреть более подробную информацию о реализации собственного пользовательского запроса в документации Volley Implementing a Custom Request.

Смежные вопросы