Login über Rest Web Service von Android mit Retrofit funktioniert nicht

Ich mache eine Android-App mit Retrofit 2 . Meine REST Api sind alle in Liferay geschrieben. Jetzt in Liferay, was ich gesehen habe, ist, auf die Web-Services zuzugreifen, die wir zuerst authentifizieren müssen. Also habe ich so authentifiziert

http://test:q1w2e3r4@192.168.0.110:8080/liferay-portlet/api/secure/jsonws/ 

Liferay hat seine eigene Benutzer-Authentifizierungsmethode, die wir überschrieben haben. Ich überprüfte den Web-Service-Aufruf von Postman seine Arbeit gut.

 URL:http://test:q1w2e3r4@192.168.0.110:8080/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name 

Formcodierte Werte

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

Wenn ich das in den Briefträger stecke, holt es die Json-Antwort richtig.

Jetzt, wenn ich das gleiche von meinem Android-Code nenne, bekomme ich eine Antwort "Unautorized".

Mein Retrofit Service

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

Meine RestApiManager-Klasse (Diese Klasse wird verwendet, um die Service-Schnittstelle aufzurufen und den Retrofit-Builder zu erstellen)

 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:q1w2e3r4@192.168.0.110:8080") .addConverterFactory(GsonConverterFactory.create()) .build(); loginApi=retrofit.create(LoginApi.class); } return loginApi; } 

Ein Anruf zum 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()); } }); 

  • Retrofit Langsame Reaktionszeit in realen Android-Geräten im Vergleich zu Emulator und Web
  • Retrofit erkannte einen nicht unterstützten OkHttp auf dem Klassenpfadfehler in OKHttp 2.0
  • Retrofit und OkHttpClient, fangen Verbindungszeitüberschreitung in der Ausfallmethode
  • Wie ändere ich Körper in OkHttp Response?
  • Square Retrofit Server Mock zum Testen
  • Ist die Retrofit-Netzanrufe auf Haupt-Thread?
  • Gibt TypeNotPresentException gefolgt von ClassNotFoundException oder NoClassDefFoundError auf Alle android Versionen außer android L
  • Wie man JSON Array packt und gson benutzt, um jedes json-Objekt zu analysieren? (Nachrüstung)
  • 5 Solutions collect form web for “Login über Rest Web Service von Android mit Retrofit funktioniert nicht”

    Es sieht aus wie vielleicht Ihre Anfrage sollte ein JSON Körper statt einer POST-Variablen? Sie rufen einen JSON Webservice an und Ihre Beispielparameter sehen mehr JSON als POST an. Wenn ja, dann können Sie Ihre Parameter in einem Objekt verkapseln –

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

    Ihre Schnittstelle wäre –

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

    Und baue deinen Anruf als –

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

    Das Session Management in Cross-Plattform funktioniert nicht so, wie es im Browser funktioniert. Briefträger ist ein Web-Client, der auf Browser-Plattform funktioniert.

    1. Eine Lösung ist, um Cookies auf dem Gerät zu halten.

    Überprüfen Sie diese Antwort, um Sessions mit Android Applikation zu verwalten .

    2.Die andere Lösung wäre, Json Web Token basierte auth verwenden.

    Ich habe versucht, Ihre Demo-Code in meinem lokalen PC laufen, aber kein Glück, wie Ihr Server in Ihrem lokalen Netzwerk ist, über diese Frage, wenn Sie mit Cookie oder Sitzung autorisieren in Ihnen Server-Seite, würde ich Vorschlag, dass Sie versuchen ,CookieHandler wie folgt , Die persistentCookieStore.java finden Sie hier

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

    Es kann schwierig sein, uns zu helfen, ohne zu wissen genau, welche Anfrage Ihre Retrofit Api baut.

    So empfehle ich Ihnen, einen Logging Interceptor zu konfigurieren, um mit dem zu beginnen, was wirklich passiert, wenn Sie noch nicht wissen, was los ist, könnten Sie mit uns weitere Informationen zurückkommen.

    Überprüfen Sie diese Antwort, um zu erfahren, wie Sie LoggingInterceptor mit Retrofit 2 konfigurieren können: Logging mit Retrofit 2

    Hoffe, dass es hilft

    Freundliche Grüße.

    Ich habe versucht alle Lösungen hier gegeben, aber leider nichts funktioniert.Die einzige Lösung, die ich gefunden, um die Lifer-Service von innerhalb von Android zu nennen ist, um Lifer mobile sdk.It hat bereits Methoden und Dienstleistungen, um Liferay-Dienste anrufen. Sie können auch auf Ihre benutzerdefinierten services.More info Liferay Mobile SDK

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.