2015-06-17 220 views
0

我正在开发连接到API的Android应用程序。为了发送获取请求,我需要发送一个发布请求,返回一个验证用户身份的cookie。如果用户在提出请求之前未通过身份验证,则对用户进行身份验证

如果我尝试发送没有认证的获取请求,我会得到一个认证失败错误。因此,我希望我的应用程序能够像这样工作:如果我发送获取请求并且未验证用户身份,请验证用户身份(authenticate方法),然后发送获取请求。

我试图在getUserProfile开始时执行此操作,但由于authenticate是异步的,它将在身份验证完成之前执行get请求。所以,这会导致错误。

if (!AppSingleton.getInstance(context).isUserAuthenticated()) { 
     authenticate(context, id); 
} 

public void authenticate (final Context ctx, int ID) { 

    StringRequest request = new StringRequest(POST, URL + ID , new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }) 
    { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/x-www-form-urlencoded"); 
      Log.d(TAG, "getHeaders: " + headers.toString()); 
      return headers; 
     } 
     @Override 
     protected Response parseNetworkResponse(NetworkResponse response) { 
      Map headers = response.headers; 
      AppSingleton.getInstance(ctx).setCookie(headers.get("Set-Cookie").toString()); 
      Log.d(TAG, "parseNetResponse: "); 
      return super.parseNetworkResponse(response); 
     } 
    }; 

    AppSingleton.getInstance(ctx).getRequestQueue().add(request); 
} 

public void getUserProfile (final Context context, final String userID) { 
    // Request a string response from the provided URL. 
    String url = GET_USER_PROFILE_URL + userID; 
    Log.d(TAG, url); 
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        // Not sure if this is a good practice. 
        ProfileActivity.displayInformation(response); 
        ProfileActivity.toggleProgress(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(context, error.toString(), Toast.LENGTH_LONG).show(); 
     } 
    }) 
    { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Cookie", AppSingleton.getInstance(context).getCookie()); 
      headers.put("Content-Type", "application/json"); 
      return headers; 
     } 
    }; 

    // Add the request to the RequestQueue. 
    AppSingleton.getInstance(context).getRequestQueue().add(stringRequest); 
} 

PS:我希望标题是有道理的。


更新:@muratgu,这是代码。我做错了什么,因为它不起作用。

getConversationMessages

Response.Listener listener = new Response.Listener() { 
     @Override 
     public void onResponse(Object o) { 
      Log.d(TAG, "getConversations: Facebook Login successful. User ID is " + o.toString()); 
     } 
    }; 

    Response.ErrorListener errorListener = new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError volleyError) { 
      Toast.makeText(context, "getConver - Authentication error: " + volleyError.toString(), Toast.LENGTH_LONG).show(); 
      Log.d(TAG, "getConver - Authentication error: " + volleyError.toString()); 
     } 
    }; 

    authenticate(context, id, listener, errorListener); 

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, listener, errorListener) { [...] 

而且authenticate

public void authenticate (final Context ctx, int ID, Response.Listener listener, Response.ErrorListener errorListener) { 

    StringRequest request = new StringRequest(POST, APP_URL + LOGIN_USER_FB_URL + ID , listener, errorListener) { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/x-www-form-urlencoded"); 
      return headers; 
     } 
     @Override 
     protected Response parseNetworkResponse(NetworkResponse response) { 
      Map headers = response.headers; 
      AppSingleton.getInstance(ctx).setCookie(headers.get("Set-Cookie").toString()); 
      return super.parseNetworkResponse(response); 
     } 
    }; 

    AppSingleton.getInstance(ctx).getRequestQueue().add(request); 
} 

回答

1
  1. 移动Response.ListenerResponse.ErrorListenergetUserProfile
  2. 将听众传递给authenticate作为参数。
  3. authenticate会在成功或失败时调用监听器。
  4. getUserProfile将在其Response.Listener内完成其工作。
+0

我试过了,但它不工作。 –

相关问题