Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return response header field to main method using Google Volley for HTTP GET request in Android / Java?

I'm using google volley for networking in android. I will make a http GET request and need to return a response header value. I found some answers on stack overflow to access the header fields, but don't know how to return it to my calling spot. Please have a look at my code, I put four numbers in it to explain my problem.

At (1) I can print out the value which I need. Than I've tried to save it in a class attribute (2) and there is no error in the IDE. If I want to return it from there (3), I got a NullPointerException at (4). Maybe its a read before write problem there. So how can I get the value from (1) to (4)? Thanks a lot!

public class Login {

String phpsessid = null;

public Login() {}

public String getSessionId(Context context) {
    RequestQueue queue = Volley.newRequestQueue(context);
    StringRequest sr = new StringRequest(Request.Method.GET, "any url",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    System.out.println(response);
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }) {
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            System.out.println(response.headers.get("Set-Cookie")); (1)
            phpsessid = response.headers.get("Set-Cookie"); (2)
            return super.parseNetworkResponse(response);
        }
    };
    queue.add(sr);
    return phpsessid; (3)
}

}

in main:

Login login = new Login();
String result = login.getSessionId(this.getContext);
System.out.println(result);  (4)
like image 770
Danny Archer Avatar asked Mar 03 '14 01:03

Danny Archer


People also ask

How do I get response header responses?

View headers with browser development toolsSelect the Network tab. You may need to refresh to view all of the requests made for the page. Select a request to view the corresponding response headers.

How do you send a header in volley?

If you need to add custom headers to your volley requests, you can't do this after initialisation, as the headers are saved in a private variable. Instead, you need to override the getHeaders() method of Request.

How do you send a response header?

Select the web site where you want to add the custom HTTP response header. In the web site pane, double-click HTTP Response Headers in the IIS section. In the actions pane, select Add. In the Name box, type the custom HTTP header name.

What is HTTP response header?

An HTTP response header is a component of a network packet that is sent by a Web server to a Web browser or client machine in response to an HTTP request. It is used in Web communications to deliver webpage and other Web-based data from the server to the requesting end-user browsers.


1 Answers

When you add a request to the queue, that request is executed asynchronously. This means it is not executed in the same order as you're reading it - it happens on another thread, and will return eventually when it's done.

protected Response<String> parseNetworkResponse(NetworkResponse response) {
    System.out.println(response.headers.get("Set-Cookie")); (1)
    phpsessid = response.headers.get("Set-Cookie"); (2)
    return super.parseNetworkResponse(response);
}

This returns the body of the response - from what I'm reading in your code, it looks like you want to return the value of the "Set-Cookie" header. You can do this like this:

protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) {
    String sessionId = response.headers.get("Set-Cookie");
    com.android.volley.Response<String> result = com.android.volley.Response.success(sessionId,
            HttpHeaderParser.parseCacheHeaders(networkResponse));
    return result;
}

This will return the value of the "Set-Cookie" header to your onResponse method:

new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        System.out.println(response);
    }
}

A better idea may be to pass a success/failure listener in when making your getSessionId call. In this way, you can then easily get access to the result in the calling class:

public void getSessionId(Context context, final Response.Listener<String> successListener, Response.ErrorListener failureListener) {
    RequestQueue queue = Volley.newRequestQueue(context); // This should be a singleton!
    StringRequest sr = new StringRequest(Request.Method.GET, "any url",
            successListener, 
            failureListener) {
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) {
            String sessionId = response.headers.get("Set-Cookie");
            com.android.volley.Response<String> result = com.android.volley.Response.success(sessionId,
                    HttpHeaderParser.parseCacheHeaders(networkResponse));
            return result;
        }
    };
    queue.add(sr);
}

Edit:

Now, you can call this as follows:

Login login = new Login();
login.getSessionId(this, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // You can access member variables from here.
                    // This will only get called after the network activity has happened!
                    phpsessid = response;
                    // All the work you need to do after your session ID has updated, you can put into a method and call it from here
                    // In your original example, this would be (4)
                    onSessionIdUpdated();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // We'll just ignore these for now - you should handle errors though!
                }
            });
// Anything you put here will happen immediately after the getSessionId call above, and notably *before* onResponse or onErrorResponse is called (ignoring potential race conditions here for now).
like image 111
Adam S Avatar answered Nov 01 '22 23:11

Adam S