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.

  • Fehler beim Auflösen: com.google.android.gms: Play-Services-Messung: 9.6.1
  • Programmuell markieren Sie den Eintrag ListView in Android
  • Play SWF-Datei im WebViewClient auf ICS?
  • ScrollView läuft überhaupt nicht
  • Android Data Binding: Sichtbarkeit auf include-Tag
  • Fügen Sie Schlagschatten hinzu, um die Navigation zu entfernen
  •  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()); } }); 

  • Ist setWidth (int Pixel) dip oder px verwenden?
  • Android-App stürzt nicht ab, reagiert aber nicht auf Ausnahmen
  • Wie benutzt man addr2line in Android?
  • Android Google Chrome nicht auslösen nach Lockscreen App
  • MediaRecorder ist fehlgeschlagen, wenn ich die Aufnahme stoppe
  • Google Maps Android API v2 erkennen lange Klick auf Karte und fügen Marker nicht funktioniert
  • 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.