2015-11-04 20 views
14

Sto creando un'app per Android utilizzando Retrofit 2. I miei REST Api sono tutti scritti in Liferay. Ora in Liferay, quello che ho visto è che per accedere ai servizi web dobbiamo prima autenticarci. Così ho autenticato come questoAccesso tramite servizio web Rest da Android utilizzando il retrofit non funzionante

http://test:[email protected]:8080/liferay-portlet/api/secure/jsonws/ 

Liferay ha il proprio metodo di autenticazione utente, che abbiamo overridden.I verificato la chiamata di servizio Web da Postman relativo funzionamento benissimo.

URL:http://test:[email protected]:8080/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name 

valori di modulo codifica

companyId:10154 
screenName:xyz 
password:xyz 
active:true 

Se metto questo nel postino, recupera correttamente la risposta JSON.

Ora quando chiamo lo stesso dal mio codice Android ottengo una risposta "Non autorizzato".

Il mio servizio Retrofit

public interface LoginApi {  
    @FormUrlEncoded 
    @POST("/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name") 
    Call<User> login(@Field("companyId")long companyId,@Field("screenName")String screenName,@Field("password")String password,@Field("active")boolean active); 
} 

mio RestApiManager Classe (Questa classe viene utilizzata per chiamare l'interfaccia del servizio e creare il costruttore retrofit)

public class RestApiManager { 

    private LoginApi loginApi; 

    public LoginApi login() { 
     if (loginApi==null) { 
      GsonBuilder gson=new GsonBuilder(); 
      gson.registerTypeAdapter(String.class, new StringDeserializer()); 
      Retrofit retrofit=new Retrofit.Builder() 
       .baseUrl("http://test:[email protected]:8080") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
      loginApi=retrofit.create(LoginApi.class); 
    } 
    return loginApi; 
} 

Una chiamata al RestApiManager

Call<User> callUser=restApiManager.login().login(loginData.getCompanyId(),loginData.getScreenName(),loginData.getPassword(),loginData.isActive()); 
callUser.enqueue(new Callback<User>() { 
    @Override 
    public void onResponse(Response<User> response, Retrofit retrofit) { 
     Log.d("Login","Login Response:"+response.body()); 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     Log.d("Login","Login Response:"+t.getMessage()); 
    } 
}); 
+1

qual è la risposta? Quale callback è chiamato? – Blackbelt

+0

si dovrebbe mettere un Loggin –

risposta

1

La gestione della sessione in multipiattaforma non funziona come funziona sul browser. Postman è un client Web che funziona sulla piattaforma del browser.

1. Una soluzione consiste nel mantenere i cookie sul dispositivo.

Verificare questa risposta manage sessions with Android Application.

2. L'altra soluzione sarebbe quella di utilizzare l'autenticazione basata su Token Web JSON.

5

Sembra che forse la tua richiesta dovrebbe avere un corpo JSON invece di una variabile POST? Si sta chiamando un servizio web JSON ei parametri di esempio hanno un aspetto più JSON di POST. Se è così, allora si può incapsulare i parametri in un oggetto -

public class User { 
    int companyId; 
    String screenName; 
    String password; 
    boolean active; 

    User(int companyId, String screenName, String password, boolean active) { 
     this.companyId = companyId; 
     this.screenName = screenName; 
     this.password = password; 
     this.active = active; 
} 

L'interfaccia sarebbe -

public interface LoginApi {  
    @POST("/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name") 
    Call<User> login(@Body User user); 
} 

e costruire la vostra chiamata come -

User user = new User(loginData.getCompanyId(),loginData.getScreenName(),loginData.getPassword(),loginData.isActive()); 
Call<User> callUser = restApiManager.login().login(user); 
1

ho provato per eseguire il codice demo nel mio PC locale, ma non è fortunato come il tuo server si trova nella tua rete locale, a proposito di questa domanda se stai utilizzando cookie o autoradio sul lato server, ti suggerirei di provare a impostareCookie Handler come seguendo, il PersistentCookieStore.java è possibile trovare here

private PersistentCookieStore cookieStore= new PersistentCookieStore(JApplication.getInstance().getApplicationContext()); 
CookieManager cookieManager = (new CookieManager(
      cookieStore, 
      CookiePolicy.ACCEPT_ALL)); 

okHttpClient.setCookieHandler(cookieManager); 
OkClient okClient = new OkClient(okHttpClient); 
RestAdapter restAdapter = new RestAdapter.Builder() 
      .setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestFacade request) { 
        request.addHeader(Constant.Header_UserAgent, getUserAgent()); 
       } 
      }) 
      .setClient(okClient) 
      .setEndpoint(URL) 
      .setErrorHandler(new HttpErrorHandler()) 
      .setConverter(new GsonConverter(gson)) 
      .build(); 
1

Può essere difficile per noi per aiutarvi senza sapere esattamente quali richiedere il vostro Api retrofit sta costruendo.

Quindi ti consiglio di configurare un intercettore di registrazione per entrare in contatto con ciò che sta realmente succedendo, quindi se ancora non sai cosa sta succedendo potresti tornare da noi con maggiori informazioni.

Controllare questa risposta per scoprire come configurare LoggingInterceptor con Retrofit 2: Logging with Retrofit 2

Speranza che aiuta.

Cordiali saluti.

0

Ho provato tutte le soluzioni fornite qui, ma purtroppo non ha funzionato. L'unica soluzione che ho trovato per chiamare il servizio di lifer da Android è utilizzare ldk mobile di lifer. Ha già metodi e servizi per chiamare i servizi di liferay. Puoi anche chiamare i tuoi servizi personalizzati.Altre informazioni Liferay Mobile SDK