2017-03-06 3 views
1

나는 sign in with Slack API을 사용하고 있습니다.개조 된 동적 URL 사용

액세스 토큰을 얻는 방식, HTTP GET 요청이 :

이 URL을 부여, 나는 WebView를 통해 로그인이를 사용하여 구현 :

로그인 통합에 WebView을 사용하고 있습니다. shouldOverrideUrlLoading 방법 안에, 내 활동 클래스에서

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

} 

:

내 클래스는 이제

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) { 

     } 
    }); 
} 

, 그것은 nullpointer 오류를 던지고 난 요청 URL이 작동하지 않는 생각, 그래서 이걸 가져라.

java.lang.NullPointerException이 : null 객체 참조에 'retrofit2.Call com.loginApi.LoginService.makeUserLogin (java.util.Map)'인터페이스 메소드를 호출하는 시도는

어떻게 할 수 HTTP GET 요청 URL이 부딪히는 것을 알고 있습니까? 어떻게하면 URL을 구축 할 수 있습니까 로그인 후 히트 및 토큰을 얻을?

+0

(loginService! = null)이 시도를 제거하고 한 번 시도해 볼 수 있습니까? 정적 메서드가 새 인스턴스를 반환하도록합니다. 아마 당신은 널 포인트 예외가 발생하는 이유는 응용 프로그램을 실행에서 지워질 수 있습니다 – Stallion

+0

내가 무엇을 제거 할 수 있는지 명확히하면 귀하의 정보가 도움이 될 것입니다? 그리고'(loginService! = null)'은 항상 'true'입니다. –

+0

위의 코드에서 같은 것을 언급하는 한 줄만 볼 수 있습니다. 왜 코드 자체에서 감지 할 수 없습니까? 내가 항상 그 조건을 확인하고 시도보다 새로운 인스턴스를 반환했다. – Stallion

답변

0

모든 방법을 만들 수 있습니다.

제거이 체크

if (loginService != null) 

와 그 해결되는지 확인합니다. 아마도 응용 프로그램이 메모리 할당/할당 해제로 인해 변수를 지웠을 것입니다.

0

당신은 일반적으로 기본 URL에 대한 https://slack.com/을 사용하고 apiinterface에 의한 loginService 개체가 검색되는 다음과 같은 성명에 .. 동적 URL 등을 가능하게

@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

물론 나는 비슷한 것을하고있다. 하지만 문제는 동적 URL이 세 가지 매개 변수를 모두 가져오고 있는지 여부를 모르겠습니다. 그래서, 로그인 토큰에 액세스하는 데 문제가 있습니다. –

+0

예 확실히 hashmap을 사용하여 세 개의 매개 변수를 모두 전달했습니다. 키와 값을 사용하여 매개 변수를 가져 와서 get 메서드와 함께 사용합니다. –

+0

URL은 https://slack.com/api/oauth.access?client_id=something&client_secret=something&code= 뭔가가 요청을받을까요? –