2016-05-22 4 views
0

Ich versuche, einen Identifikations-Cookie von einer Website gesendet werden, und dafür verwende ich Volley library.Holen Sie sich Cookie von der Website mit Volley

Zunächst einmal ja ich dieses Thema ausgiebig von Tagen in den letzten paar gesucht haben und ich es geschafft, alle Antworten mit diesem Code, Rack:

public class Login extends AppCompatActivity { 
StringRequest stringRequest = null; 
RequestQueue queue; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    queue = Volley.newRequestQueue(this); 
    Button b = (Button) findViewById(R.id.bauth); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final String url = "http://daviddurand.info/D228/pizza/?action=login&user=david"; 
      stringRequest = new StringRequest(Request.Method.GET, url, 
        new Response.Listener<String>() { 
         @Override 
         public void onResponse(String response) { 
          CookieManager manager = new CookieManager(); 
          CookieHandler.setDefault(manager); 
          try { 
           Log.d("URI 1", manager.getCookieStore().get(new URI("http://daviddurand.info/D228/pizza/?action=login&user=david")).toString()); 
          } catch (URISyntaxException e) { 
           e.printStackTrace(); 
          } 
          Log.d("URIS", manager.getCookieStore().getURIs().toString()); 
          Log.d("COOKIE", manager.getCookieStore().getCookies().toString()); 
         } 
        }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //error 
       } 
      }); 
      // Add the request to the RequestQueue. 
      queue.add(stringRequest); 
     } 
    }); 

} 

}

Was nicht zurückkommt alles mehr als leere Klammern, also rate ich etwas (s) falsch .. Für den Anfang bin ich hier richtig? und was genau muss ich hinzufügen, damit dies funktioniert?

+0

Huch. Ich denke, Sie müssten eine benutzerdefinierte "Request" Unterklasse erstellen, die sowohl die Serverdaten als auch die Cookies zurückgeben würde. Ich würde dem 'CookieManager' nicht trauen, die aktualisierten Cookies genau zu dem Zeitpunkt zu haben, zu dem ich sie angefordert habe. –

Antwort

-1

Okay, also für alle Interessierten in der Lösung, i mit OkHttp beendet, um eine Klasse zu erstellen genannt OkHttpStack und übergeben es an die Volley-Anfrage und mit Djodjos Antwort, endete ich mit genau dem, was ich brauchte, um es zur Arbeit zu bekommen!

OkHttpStack.java:

import com.android.volley.toolbox.HurlStack; 
import com.squareup.okhttp.OkHttpClient; 
import com.squareup.okhttp.OkUrlFactory; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 
/** 
* An {@link com.android.volley.toolbox.HttpStack HttpStack} implementation which 
* uses OkHttp as its transport. 
*/ 
public class OkHttpStack extends HurlStack { 
private final OkUrlFactory mFactory; 

public OkHttpStack() { 
    this(new OkHttpClient()); 
} 

public OkHttpStack(OkHttpClient client) { 
    if (client == null) { 
     throw new NullPointerException("Client must not be null."); 
    } 
    mFactory = new OkUrlFactory(client); 
} 

@Override protected HttpURLConnection createConnection(URL url) throws IOException { 
    return mFactory.open(url); 
} 
} 

Und die Updates der Hauptklasse:

public class Login extends AppCompatActivity { 
Request stringRequest = null; 
RequestQueue queue; 
CookieManager manager = new CookieManager(null,CookiePolicy.ACCEPT_ALL); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    CookieHandler.setDefault(manager); 
    queue = Volley.newRequestQueue(this, new OkHttpStack()); 
    Button b = (Button) findViewById(R.id.bauth); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final String url = "http://daviddurand.info/D228/pizza/?action=login&user=david"; 
      stringRequest = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() { 

         @Override 
         public void onResponse(String response) { 

          try { 
           Log.d("URI 1", manager.getCookieStore().get(new URI("http://daviddurand.info/D228/pizza/?action=login&user=david")).toString()); 
          } catch (URISyntaxException e) { 
           e.printStackTrace(); 
          } 
          Log.d("response",response); 
          Log.d("URIS", manager.getCookieStore().getURIs().toString()); 
          Log.d("COOKIE", manager.getCookieStore().getCookies().toString()); 
          try { 
           Log.d("request", stringRequest.getHeaders().toString()); 
          } catch (AuthFailureError authFailureError) { 
           authFailureError.printStackTrace(); 
          } 
         } 
        }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //error 
       } 
      }); 
      // Add the request to the RequestQueue. 
      queue.add(stringRequest); 
     } 
    }); 

} 
+0

okhttp hat nichts mit dem Cookie-Manager zu tun, aber die genaue Antwort, die ich Ihnen gab und Sie tatsächlich verwendet. Ich finde es ziemlich merkwürdig, dass du meine Antwort verwendest, dann schreibst du deine eigene oben drauf und akzeptierst sie. – djodjo

+0

Mit Cookie-Manager war hier nicht die Frage, Cookies von dem Server mit Volley zu bekommen. Wenn Sie Ihre Antwort ohne OkHttp verwenden, wird nichts gelöst und der Wert bleibt leer. – Ilias

+0

In der Tat war es, weil Sie einen Fehler hatten, auf den ich hingewiesen habe. – djodjo

0

Sie brauchen nicht diese zu stellen:

CookieManager manager = new CookieManager(); 
CookieHandler.setDefault(manager); 

in Ihrer Antwort. aber nur einmal, bevor du anfängst zu telefonieren.

Mit CookieHandler HttpURLConnection, die anscheinend der HTTP-Stack ist, den Sie verwenden :), kümmert sich um die Cookies, so dass Sie in Volley selbst kümmern müssen.

so können Sie tun

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

kurz vor queue = Volley.newRequestQueue(this);