2016-05-22 3 views
0

Я пытаюсь получить файл cookie, отправленный с веб-сайта, и для этого я использую Volley library.Получить cookie с сайта с помощью volley

Прежде всего, да я искал эту тему широко в течение последних нескольких дней, и используя все ответы, которые мне удалось наберешь этот код:

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

} 

}

Который не возвращается ничего больше, чем пустые скобки, так что я угадываю что-то неправильно. Для начала я возглавляю правильный путь здесь? и что именно мне нужно добавить, чтобы сделать эту работу?

+0

Хлоп. Я думаю, вам нужно будет создать пользовательский подкласс 'Request', который будет возвращать как данные сервера, так и файлы cookie. Я бы не стал доверять «CookieManager» для обновления файлов cookie в то время, когда я их просил. –

ответ

-1

Итак, для тех, кто заинтересован в решении, я в конечном итоге с помощью OkHttp создать класс под названием OkHttpStack и передал его запрос волейбола и ответ djodjo, я закончил с тем, что мне нужно, чтобы заставить его работать!

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

И обновление к основному классу:

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 не имеет ничего общего с менеджером файлов cookie, но точный ответ, который я вам дал, и вы на самом деле использовали его. Мне показалось довольно странным, что вы используете мой ответ, а затем пишете его поверх него и принимаете это. – djodjo

+0

Использование менеджера файлов cookie здесь не было, получение файлов cookie с сервера с Volley было. использование вашего ответа без OkHttp ничего не решает, и значение остается пустым. – Ilias

+0

действительно, это было потому, что у меня была ошибка, на которую я указал. – djodjo

0

вам не нужно ставить так:

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

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

Использование CookieHandler HttpURLConnection, которое, по-видимому, является стекем http, который вы используете :), заботится о файлах cookie, поэтому вам нужно позаботиться об этом в самом Volley.

так что вы можете сделать

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

непосредственно перед queue = Volley.newRequestQueue(this);

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