2014-11-17 1 views
0

이러한 메소드는 HttpHelper 클래스에 있습니다. 이제 초기 호출은 사용자 자격 증명의 유효성을 검사하고 true를 반환합니다. 그것은 예상된다. 다음 호출은 사용자를 등록하는 것입니다. 그건 딸꾹질없이 잘가는 것 같고 새로운 사용자 ID를 반환하는 것입니다. 사용자 ID를 반환하는 대신 true를 다시 반환합니다. 거의 캐시 된 것처럼 처음 호출에서 결과를 반환합니다. 왜 이런 일이 일어날 지에 대한 생각을 가진 사람은 누구입니까?후속 httpClient 호출이 초기 호출 결과를 반환합니다.

private static CookieStore sCookieStore; 

private static String invoke(HttpUriRequest request) 
      throws ClientProtocolException, IOException { 
     String result = null; 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 

     // restore cookie 
     if (sCookieStore != null) { 
      httpClient.setCookieStore((org.apache.http.client.CookieStore) sCookieStore); 
     } 

     //request.addHeader("Host", "localhost"); 
     HttpResponse response = httpClient.execute(request); 

     StringBuilder builder = new StringBuilder(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent())); 
     for (String s = reader.readLine(); s != null; s = reader.readLine()) { 
      builder.append(s); 
     } 
     result = builder.toString(); 
     Log.d(TAG, "result is (" + result + ")"); 

     // store cookie 
     sCookieStore = (CookieStore) ((AbstractHttpClient) httpClient).getCookieStore(); 
     return result; 
    } 

public static String invokeGet(String action, List<NameValuePair> params) { 
     try { 
      StringBuilder sb = new StringBuilder(API_URL); 
      sb.append(action); 
      if (params != null) { 
       for (NameValuePair param : params) { 
        sb.append("?"); 
        sb.append(param.getName()); 
        sb.append("="); 
        sb.append(param.getValue()); 
       } 
      } 
      Log.d(TAG, "url is" + sb.toString()); 
      //HttpGet httpGet = new HttpGet(URLEncoder.encode(sb.toString(), "UTF-8")); 
      HttpGet httpGet = new HttpGet(sb.toString()); 

      return invoke(httpGet); 
     } catch (Exception e) { 
      Log.e(TAG, e.toString()); 
     } 

     return null; 
    } 

    public static String invokeGet(String action) { 
     return invokeGet(action, null); 
    } 

다음은 내가 작성한 전화입니다. 위에 지정된대로 authResult 변수는 문자열 결과가 true가됩니다. nextResult 사용자 ID 값을 보유하는 대신 초기 요청과 같은 참 값을 유지해야

String authResult = HttpHelper.invokeGet("<url to validate user>"); 

     if (this.URL.indexOf("register") > -1)  
      String nextResult = HttpHelper.invokeGet(this.URL); 
     else 
      String nextResult = HttpHelper.invokeGet(this.URL); 

업데이트는 다음 sCookieStore 변수에 추가.

업데이트] 2 다음 API (MVC .NET)를 통해 호출되는 방법에 추가하면 :

public bool Get(String userName, String userPassword) 
     { 
      Task<IdentityUser> iu = _repo.FindUser(userName, userPassword); 

      if (iu != null) 
      { 
       FormsAuthentication.SetAuthCookie(userName, false); 
       return true; 
      } 

      return false; 
     } 

nextResult 변수가이 결과를 얻어야한다 :

authResult 변수는이 결과를 얻을 것이다 :

[HttpGet] 
    [AllowAnonymous] 
    public async Task<IHttpActionResult> RegisterUser(String userName, String userPassword, String huh) 
    { 
     UserModel userModel = new UserModel(); 
     userModel.ConfirmPassword = userPassword; 
     userModel.UserName = userName; 
     userModel.Password = userPassword; 

     String userID = ""; 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     IdentityResult result = await _repo.RegisterUser(userModel); 

     IHttpActionResult errorResult = GetErrorResult(result); 

     if (errorResult != null) 
     { 
      return errorResult; 
     } 
     else 
     { 
      Task<IdentityUser> iu = _repo.FindUser(userModel.UserName, userModel.Password); 

      using (var context = new AuthContext()) 
      { 
       var userStore = new UserStore<IdentityUser>(context); 
       var userManager = new UserManager<IdentityUser>(userStore); 

       userID = iu.Result.Id; 

       result = await userManager.AddToRoleAsync(userID, "Users"); 

       errorResult = GetErrorResult(result); 

       if (errorResult != null) 
       { 
        return errorResult; 
       } 
      } 
     } 

     return Ok("userID:" + userID); 
    } 
+0

올바른 URL을 치고 있으며 컬을 사용하여 응답을 테스트했다고 가정합니다. 또한'for (NameValuePair param : params) {sb.append ("?"); ..''버그를 가지고 있습니다. – Vlad

+0

@Vlad - 사용중인 API는 .NET MVC로 작성되었습니다. 저는 Visual Studio 2013을 통해 테스트를했으며 모든 것이 잘 돌아갔습니다. NameValuePair 이제 방금 매개 변수를 전달할 때 메서드의 해당 부분을 사용하지 않았기 때문에 방금 포함 된 NameValuePair입니다. 그래서 나는 아직 그 코드의 그 부분을 디버깅하지 않았다. 다른 invokeGet 및 현재 사용중인 null 전달 때문에 추가되었습니다. – iCobot

답변

0

모양은 입니다. authResultinvokeGet을 두 번 실행하여 동일한 인수 (this.URL)를 부여합니다. invokeGet 내에서 변수 sbthis.URL이 될 것입니다. 두 번 모두 기능이 실행됩니다.

이 조금 나에게 호기심 :

// store cookie 
    sCookieStore = (CookieStore) ((AbstractHttpClient) httpClient).getCookieStore(); 

는 sCookieStore는 마지막에 다음
// restore cookie 
    if (sCookieStore != null) { 
     httpClient.setCookieStore((org.apache.http.client.CookieStore) sCookieStore); 
    } 

을 정의? 쿠키가 올바르게 처리되지 않고 두 개의 새로운 연결을 만들 수 있습니다. 쿠키를 가져오고 설정하는 것이 문제가되면 의 시작 부분에 존재하는 쿠키가있는 경우을 호출 한 다음 나중에 새로운 쿠키를 설정하는 것이 좋습니다.

+0

authResult는 invokeGet을 두 번 실행하지 않습니다. 초기 호출은 사용자를 확인하는 것입니다. 그런 다음 URL을 기반으로 단어 레지스터가 포함되어 있으면 그 일을합니다. 이것은 나중에 invokePost로 변경 될 것이지만 코드를 작동시키기위한 테스트 용으로 만 수행되었으므로 브라우저를 통해 테스트 할 수도 있습니다.sCookieStore는 해당 정적 클래스의 정적 변수입니다. 초기 사용자 유효성 검사가 해당 변수를 설정하고 API를 통한 후속 요청에 대한 권한 부여에 사용되기 때문에 각 요청에 쿠키를 전달해야합니다. – iCobot

+0

또한 안드로이드 디버거를 통해 및 invoke 메서드 내에서 요청 변수에 대해 각 인스턴스에 대해 사용중인 올바른 URL을 표시합니다. – iCobot

+0

죄송합니다. 내가 의미하는 바가 명확하지 않습니다. 귀하의 설명에서 authResult를 여러 번 실행하는 것처럼 들렸습니다. 그럴까요? – Matt

관련 문제