2017-03-06 5 views
1

Ich verwende sign in with Slack API.Verwenden Sie dynamische URL mit Retrofit

ein Zugriffstoken zu erhalten, gibt es eine HTTP-GET-Anforderung ist:

Diese URL ist autorisieren, verwende ich diese für die Anmeldung und implementiert über WebView:

Ich verwende WebView für Login-Integration.

Meine Klassen sind:

public class LoginApiClient { 
private static LoginService loginService; 

public static LoginService getLoginService(){ 
    if (loginService != null){ 
     Retrofit retrofitClient = new Retrofit.Builder() 
       .baseUrl("https://slack.com/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     loginService = retrofitClient.create(LoginService.class); 
    } 
    return loginService; 
} 
} 

public interface LoginService { 
    @FormUrlEncoded 
    @GET("api/oauth.access") 
    Call<LoginResponse> makeUserLogin(@FieldMap Map<String, String > parameter); 
} 

public class LoginResponse { 
    ..... 
    @SerializedName("access_token") 
    @Expose 
    private String accessToken; 
    ..... 
    public String getAccessToken() { 
     return accessToken; 
    } 

    public void setAccessToken(String accessToken) { 
     this.accessToken = accessToken; 
    } 

} 

In meiner Aktivitätsklasse, innen shouldOverrideUrlLoading Methode:

public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("http://localhost:8000/")) { 

      UrlQuerySanitizer urlQuerySanitizer = new UrlQuerySanitizer(url); 
      codeParams = urlQuerySanitizer.getValue("code"); 
      Log.e(TAG, "shouldOverrideUrlLoading: " + codeParams); 
      retrieveToken(); 
      return true; 
     } else { 
      view.loadUrl(url); 
      return true; 
     } 
    } 

private void retrieveToken() { 
    LoginService loginService = LoginApiClient.getLoginService(); 
    Map<String, String> urlParameter = new HashMap<>(); 
    urlParameter.put("client_id", StringConstant.CLIENT_ID); 
    urlParameter.put("client_secret", StringConstant.CLIENT_SECRET); 
    urlParameter.put("code", codeParams); 
    Call<LoginResponse> call = loginService.makeUserLogin(urlParameter); 
    call.enqueue(new Callback<LoginResponse>() { 
     @Override 
     public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
      //navigate to next activity after saving token 
     } 

     @Override 
     public void onFailure(Call<LoginResponse> call, Throwable t) { 

     } 
    }); 
} 

Es wird nun die Nullpointer Fehler zu werfen, und ich denke, dass die URL nicht funktioniert, so dass ich bekomme das.

java.lang.NullPointerException: Versuch Schnittstelle Methode aufzurufen 'retrofit2.Call com.loginApi.LoginService.makeUserLogin (java.util.Map)' auf null Objektreferenz

Wie kann ich Wissen Sie, dass die HTTP-GET-Anfrage-URL trifft? Wie kann ich die URL erstellen und nach dem Login wird es getroffen und ich bekomme Token?

+0

Können Sie diese Überprüfung entfernen, wenn (LoginService! = Null) und einmal versuchen? Lassen Sie die statische Methode neue Instanzen zurückgeben. Wahrscheinlich wird es im Anwendungslauf gelöscht, deshalb erhalten Sie null Punkt Ausnahme – Stallion

+0

Ihre Informationen werden für mich hilfreich sein, wenn Sie klären, was kann ich entfernen? Und, '(loginService! = Null)' ist immer 'wahr'. –

+0

In Ihrem obigen Code kann ich nur eine Zeile sehen, die dasselbe erwähnt. Sie fragen sich, warum Sie nicht in Ihrem Code selbst erkennen konnten? Wie gesagt, immer neue Instanz zurückgeben, als diese Bedingung überprüfen und versuchen – Stallion

Antwort

0

Möglicherweise aufgrund der folgenden Aussage, wo das loginService Objekt abgerufen wird.

Entfernen dieses Kontroll

if (loginService != null) 

und sehen, ob das behebt. Wahrscheinlich hätte die Anwendung die Variable wegen Speicherzuweisung/-zurücksetzung gelöscht

0

Sie können https://slack.com/ für Basis-URL als üblich verwenden und in apiinterface alle Methode mit dynamischer URL erstellen wie ..

@GET("api/oauth.access") 
Call<JsonElement> oauth.access(@QueryMap HashMap<String, String> body); 

@GET("oauth/authorize") 
Call<JsonElement> oauth.access(@QueryMap HashMap<String, String> body); 
+0

Natürlich mache ich das ähnlich. Aber das Problem ist, ich weiß nicht, dass die dynamische URL alle drei Parameter bekommt oder nicht. Also, ich habe Probleme, auf das Login-Token zuzugreifen. –

+0

ja, es hat definitiv alle drei Parameter nur mit hashmap bestanden nehmen Sie Ihre Parameter mit Schlüssel und Wert und verwenden Sie mit Get-Methode –

+0

Ist die URL: https://slack.com/api/oauth.access?client_id=etwas & client_secret = etwas & code = etwas bekommen Anfrage? –