John P
John P

Reputation: 1221

Android volley. Get data from the header of the HTTP response

I am making http requests to my REST server. As a response I get the JSON body. But I need to get also a parameter from the response header, as I keep the user token in it. I have looked at a lot of posts on Stack Overflow for similar questions, but I they don't seem to have helped me. I want to make a JSON request, and get the body and headers form the response. How can I do it? Here is my code:

Please don't mark the question as duplicate, as I have not found any example where I can retrieve both: the response header and the response body. For the existing questions, users get only the headers

   JsonObjectRequest req = new JsonObjectRequest(AppConfig.URL_LOGIN, new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    System.out.println(response.toString());
                    hideDialog();

                    try {
                        JSONObject jObj = response;

                        String uid = jObj.getString("_id");
                        String name = jObj.getString("fullName");
                        String email = jObj.getString("email");

                        // Inserting row in users table
                        db.addUser(name, email, uid);

                        Toast.makeText(getApplicationContext(), "User successfully registered. Try login now!", Toast.LENGTH_LONG).show();

                        Intent intent = new Intent(
                                LoginActivity.this,
                                MainActivity.class);
                        startActivity(intent);
                        finish();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            NetworkResponse networkResponse = error.networkResponse;
            String toastError = "Response code: " + networkResponse.statusCode;
            Toast.makeText(getApplicationContext(),
                    toastError, Toast.LENGTH_LONG).show();

            hideDialog();
        }
    });

Upvotes: 0

Views: 2105

Answers (1)

injecteer
injecteer

Reputation: 20707

You can't do that using JsonObjectRequest. You should extend the Request class and implement parseNetworkResponse() method which provides access to low-level NetworkResponse object. Downside is of course that you have to re-implement JSON parsing as well, but this is not really a big deal.

Something like:

public class HeaderAwareJsonRequest extends Request<Pair<JSONObject,Map>> {
  protected Response.Listener<Pair<JSONObject,Map>> listener;

  public HeaderAwareJsonRequest( int method, String url, Response.Listener<Pair<JSONObject,Map>> listener, Response.ErrorListener errorListener ) {
    super( method, url, errorListener );
    this.listener = listener;
  }

  @Override
  protected Response<Pair<JSONObject,Map>> parseNetworkResponse( NetworkResponse response ) {
    try{
      String jsonString = new String( response.data, HttpHeaderParser.parseCharset( response.headers ) );
      // pair contains the json body and headers 
      Pair pair = new Pair( new JSONObject( jsonString ), response.headers );
      return Response.success( pair, HttpHeaderParser.parseCacheHeaders( response ) );
    }catch( Exception e ){
      return Response.error( new ParseError( e ) );
    }
  }    
}

then in the calling code:

HeaderAwareJsonRequest req = new HeaderAwareJsonRequest( 
   Request.Method.GET, 
   AppConfig.URL_LOGIN, 
   new Response.Listener<Pair<JSONObject,Map>>() {
     @Override
     public void onResponse(Pair<JSONObject,Map> response) {
       JSONObject jObj = response.first;
       Map headers = response.second;
       String someHeader = headers.get( "aaaaa" );
       ...
     }
   }, 
   new Response.ErrorListener() {...} 
); 

Upvotes: 1

Related Questions