android - restaurar - twitter no carga
Mantenimiento de la sesiĆ³n en Android(la aplicaciĆ³n permanece autenticada en el servidor) (5)
Aquí hay otra implementación que usa Volley library ... una sugerencia muy útil de https://stackoverflow.com/a/36496607/3099185
CustomRequest jsonObjReq = new CustomRequest(Request.Method.GET,
url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_SHORT).show();
// hide the progress dialog
}
});
Clase de solicitud personalizada
import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class CustomRequest extends JsonObjectRequest {
private String session_id = "";
public CustomRequest(int method, String url, JSONObject jsonRequest,
Response.Listener listener, Response.ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
}
public CustomRequest(int method, String url, JSONObject jsonRequest, String session_id,
Response.Listener listener, Response.ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
this.session_id = session_id;
}
@Override
public Map getHeaders() throws AuthFailureError {
Map headers = new HashMap();
Log.d(TAG, " -> session_id = " + session_id);
if(!(session_id.equals(""))) {
headers.put("Cookie", this.session_id);
}
return headers;
}
}
Manera simple de implementar la volea utilizando el patrón de singleton http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/
Recuerde inicializar mRequestQueue en onCreate () para evitar excepciones inesperadas del puntero nulo
@Override
public void onCreate() {
super.onCreate();
// initialize the singleton
sInstance = this;
mRequestQueue = Volley.newRequestQueue(this);
}
Espero que esta ayuda también ...! :)
Estoy construyendo una aplicación de inicio de sesión en Android en la que toco una url (con nombre de usuario y contraseña) hasta esa parte que funciona bien pero después de eso cada vez que toco una url (una vez que el usuario está autenticado), no devuelve nada (es decir, mensaje de error como iniciar sesión primero). Sin embargo, funciona bien en una aplicación de iPhone muy similar y en el navegador.
Llegué a algún lugar que es el error de phpSessionId (es decir, la sesión se destruye para solicitar más) y Si queremos que nuestra aplicación Android se mantenga autenticada en el lado del servidor, tenemos que buscarla luego de la primera conexión y luego enviarla en el encabezados de todas nuestras solicitudes posteriores.
Pero el problema es que no puedo obtener la sessionId del encabezado de la primera conexión y enviarla con otra solicitud junto con el encabezado.
Por favor, dame algunos códigos o enlaces para completar la tarea correctamente. Gracias.
Finalmente resolví el problema del manejo de sesiones en Android . Android no puede manejar la sesión en sí (lo que puede hacer un simple navegador), así que debemos manejarla de manera explícita. Cambié un poco el código para la conexión http. Creó una instancia de DefaultHttpClient en la primera Actividad cuando se estableció la conexión.
public static DefaultHttpClient httpClient;
Por primera vez, hice lo siguiente:
URL url=new URL(urlToHit);
LoginScreen.httpClient = new DefaultHttpClient(); //LoginScreen is the name of the current Activity
HttpPost httppost = new HttpPost(url.toString());
HttpResponse response = LoginScreen.httpClient.execute(httppost);
xr.parse(new InputSource(url.openStream())); //SAX parsing
Ahora, para todas las conexiones adicionales, utilicé el mismo httpClient. Por ejemplo, en la siguiente actividad:
URL url=new URL(urlToHit);
HttpPost httppost = new HttpPost(url.toString());
HttpResponse response = LoginScreen.httpClient.execute(httppost);
// Log.v("response code",""+response.getStatusLine().getStatusCode());
// Get hold of the response entity
HttpEntity entity = response.getEntity();
InputStream instream = null;
if (entity != null) {
instream = entity.getContent();
}
xr.parse(new InputSource(instream)); //SAX parsing
Espero que esto te ayude a todos a resolver el problema de la sesión en Android .
Hace un tiempo escribí una publicación acerca de ella en el coderwall Utiliza las clases HttpRequestInterceptor y HttpResponseInterceptor , que son perfectas para ese tipo de situaciones.
Aquí hay un ejemplo:
public class HTTPClients {
private static DefaultHttpClient _defaultClient;
private static String session_id;
private static HTTPClients _me;
private HTTPClients() {
}
public static DefaultHttpClient getDefaultHttpClient(){
if ( _defaultClient == null ) {
_defaultClient = new DefaultHttpClient();
_me = new HTTPClients();
_defaultClient.addResponseInterceptor(_me.new SessionKeeper());
_defaultClient.addRequestInterceptor(_me.new SessionAdder());
}
return _defaultClient;
}
private class SessionAdder implements HttpRequestInterceptor {
@Override
public void process(HttpRequest request, HttpContext context)
throws HttpException, IOException {
if ( session_id != null ) {
request.setHeader("Cookie", session_id);
}
}
}
private class SessionKeeper implements HttpResponseInterceptor {
@Override
public void process(HttpResponse response, HttpContext context)
throws HttpException, IOException {
Header[] headers = response.getHeaders("Set-Cookie");
if ( headers != null && headers.length == 1 ){
session_id = headers[0].getValue();
}
}
}
}
La mejor idea es poner toda la función que hace su servidor en la clase única a la que llamarán las tareas que deseen conectarse. Yo llamo a esta clase WebServiceManager. Esta clase tiene exactamente el mismo método que el servidor.
Como quiera una sesión única, haga lo siguiente:
private static WebServiceManager wsm = null;
public static WebServiceManager getInstance() {
if (wsm == null) {
wsm = new WebServiceManager();
}
return wsm;
}
private final HttpClient httpClient;
private WebServiceManager() {
httpClient=new DefaultHttpClient();
}
y luego llama al método de su instancia de webServiceManager para usar siempre la misma sesión. :)
Mi problema fue que primero inicie sesión y guardé la sesión devuelta en las preferencias del usuario. Después de eso, la llamada POST para establecer un registro dijo
"Error, no se puede autenticar al usuario"
Así que agregué post.setHeader("oAuth-Token", UserPreferences.ACCESS_TOKEN);
todo se ve así.
HttpPost post=new HttpPost(URL );
post.setHeader("oAuth-Token", UserPreferences.ACCESS_TOKEN);
. . y resolvió el problema.