2011-09-27 68 views
4

我已经为此搜索了很多,无法找到一个体面的解决方案。使用凭证提供程序的方法很糟糕,因为它使与请求相反的调用数量加倍,即它触发请求,获取401并仅使用Web认证凭证触发请求。如何使用带Web身份验证的Apache httpclient执行http post?

任何使用android的httpclient库来完成http post请求到web身份验证成功后的URL?

回答

5

对于HttpClient的4.0.x的您使用HttpRequestInterceptor启用抢先认证 - 因为AndroidHttpClient类不公开addRequestInterceptor(..)方法,你可能将不得不使用DefaultHttpClient类。

本示例将垃圾邮件user1/user1传送给任何感兴趣的服务器。如果您关心安全性,请调整AuthScope

 
DefaultHttpClient client = new DefaultHttpClient(); 
client.getCredentialsProvider().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user1", "user1")); 
client.addRequestInterceptor(new HttpRequestInterceptor() { 
    public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { 
     AuthState state = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE); 
     if (state.getAuthScheme() == null) { 
      BasicScheme scheme = new BasicScheme(); 
      CredentialsProvider credentialsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER); 
      Credentials credentials = credentialsProvider.getCredentials(AuthScope.ANY); 
      if (credentials == null) { 
       throw new HttpException(); 
      } 
      state.setAuthScope(AuthScope.ANY); 
      state.setAuthScheme(scheme); 
      state.setCredentials(credentials); 
     } 
    } 
}, 0); // 0 = first, and you really want to be first. 
+0

感谢名单一吨,将尝试了这一点..发现http://dlinsin.blogspot.com/2009/08/http-basic-authentication-with-android.html同样的事情,但我必须有做错了什么。那标志0代表什么,没有真正知道它 – Nitin

+0

0是请求拦截器的位置,即0是第一个,它将首先处理请求。 – Jens

+0

很酷将标记它接受,只要我尝试了它,它的工作:) – Nitin

相关问题