¿Cómo devolver el campo de encabezado de respuesta al método principal utilizando Google Volley para la solicitud HTTP GET en Android / Java?

Estoy utilizando google volley para redes en android. Haré una petición http GET y necesitaré devolver un valor de encabezado de respuesta. He encontrado algunas respuestas sobre desbordamiento de pila para acceder a los campos de encabezado, pero no sé cómo devolverlo a mi lugar de llamada. Por favor, eche un vistazo a mi código, pongo cuatro números en él para explicar mi problema.

En (1) puedo imprimir el valor que necesito. Que he intentado guardarlo en un atributo de clase (2) y no hay error en el IDE. Si quiero volver de allí (3), tengo una NullPointerException en (4). Quizás es un leer antes escribir problema allí. Entonces, ¿cómo puedo obtener el valor de (1) a (4)? ¡Muchas gracias!

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) } 

}

En principal

 Login login = new Login(); String result = login.getSessionId(this.getContext); System.out.println(result); (4) 

Cuando agrega una solicitud a la cola, esa solicitud se ejecuta de forma asíncrona . Esto significa que no se ejecuta en el mismo orden en que lo estás leyendo – sucede en otro hilo, y volverá al final cuando se hace.

 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); } 

Esto devuelve el cuerpo de la respuesta – de lo que estoy leyendo en su código, parece que desea devolver el valor de la "Set-Cookie" encabezado. Puedes hacer esto así:

 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; } 

Esto devolverá el valor del encabezado "Set-Cookie" a su método onResponse :

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

Una mejor idea puede ser pasar un oyente de éxito / fracaso al hacer su llamada getSessionId . De esta manera, puede acceder fácilmente al resultado en la clase que llama:

 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); } 

Editar:

Ahora, puede llamar a esto como sigue:

 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). 
  • Symfony2 http, funciona con curl pero no en Android
  • La validación de URL funciona bien, pero mantiene la conexión y restringe las solicitudes adicionales
  • Obtén el encabezado de HttpResponse en Android
  • Retrofit Image Upload dar error
  • Enviar solicitud HTTP GET con el encabezado
  • @ Convertido a% 40 en la solicitud HTTPPost
  • ¿Qué encabezado se debe utilizar para enviar GZIP comprimido JSON de Android Client a Server?
  • Google TTS API para árabe, chino y griego
  • Pasar encabezados mientras utiliza la intención del navegador
  • Android: Captura de solicitudes HTTP con un dispositivo Android no enraizado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.