How to do http post using apache httpclient with web authentication?
I have searched a LOT for this and could not find a decent solution. The one using credentials provider is bad as it make double the amount of calls opposed to what is required i.e. it fires the request , gets a 401 and only then fires the request with the web auth credentials.
Anyone who has used android's http开发者_开发问答client library to do http post requests to a URL behind web auth successfully??
For HttpClient 4.0.x you use a HttpRequestInterceptor to enable preemptive authentication - since the AndroidHttpClient
class doesn't expose the addRequestInterceptor(..)
method you're probably going to have to use the DefaultHttpClient
class.
This example will spam user1
/user1
to any server interested. Adjust the AuthScope
if you care even one bit about security.
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.
精彩评论