このリンク を参照してサーバーにリクエストします。問題はいつか(常にではありませんが、約20%-30%、いつか成功した応答を得ることができることを意味します)、401エラーとサーバー応答が期待されますが、見つかりません。
これが私のコードです:
HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor()
{
public void process(final HttpRequest request, final HttpContext context)
throws HttpException, IOException
{
AuthState authState = (AuthState) context
.getAttribute(ClientContext.TARGET_AUTH_STATE);
CredentialsProvider credsProvider = (CredentialsProvider) context
.getAttribute(ClientContext.CREDS_PROVIDER);
HttpHost targetHost = (HttpHost) context
.getAttribute(ExecutionContext.HTTP_TARGET_Host);
if (authState.getAuthScheme() == null)
{
AuthScope authScope = new AuthScope(targetHost.getHostName(),
targetHost.getPort());
Credentials creds = credsProvider.getCredentials(authScope);
if (creds != null)
{
authState.setAuthScheme(new BasicScheme());
authState.setCredentials(creds);
}
}
}
};
これが私の認証です:
HttpPost httpPost = new HttpPost(SERVER_AUTH_URL);
httpPost.setHeader("Content-type", "text/xml; charset=utf-8");
httpPost.setHeader("Keep-Alive", "300");
httpPost.setHeader("Connection", "Keep-Alive");
StringEntity se = new StringEntity(myRequest, "UTF-8");
httpPost.setEntity(se);
se.setContentType("text/xml");
se.setContentEncoding("gzip,deflate");
//add preemptiveAuth
client.addRequestInterceptor(preemptiveAuth, 0);
//Set the proxy
ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
client.getConnectionManager().getSchemeRegistry(),
ProxySelector.getDefault());
client.setRoutePlanner(routePlanner);
List<String> authPrefs = new ArrayList<String>();
authPrefs.add(AuthPolicy.BASIC);
authPrefs.add(AuthPolicy.NTLM);
authPrefs.add(AuthPolicy.DIGEST);
client.getParams().setParameter("http.auth.scheme-priority", authPrefs);
CredentialsProvider credProvider = new BasicCredentialsProvider();
// client.getParams().setParameter("http.auth.scheme-priority",
// authPrefs);
credProvider.setCredentials(AuthScope.ANY,
new NTCredentials(getUsername(), getPassword(),
"", getDomain()));
Log.d(TAG, "repair excute");
client.setCredentialsProvider(credProvider);
HttpResponse response = client.execute(httpPost);
Log.d(TAG, "has excute");
コメントコードから、私が多くの方法を試したことがわかりますが、エラーは消えませんでした。これがlogcatsayです:
05-02 10:28:21.724: D/dalvikvm(1169): GC_FOR_MALLOC freed 11259 objects / 457352 bytes in 43ms
05-02 10:28:22.384: D/MainActivity(1169): repair excute
05-02 10:28:22.744: D/dalvikvm(1169): GC_FOR_MALLOC freed 11481 objects / 447264 bytes in 67ms
05-02 10:28:22.894: D/dalvikvm(1169): GC_FOR_MALLOC freed 1078 objects / 83928 bytes in 76ms
05-02 10:28:22.894: I/dalvikvm-heap(1169): Grow heap (frag case) to 3.833MB for 87396-byte allocation
05-02 10:28:23.034: D/dalvikvm(1169): GC_FOR_MALLOC freed 58 objects / 3336 bytes in 143ms
05-02 10:28:23.124: W/DefaultRequestDirector(1169): Authentication error: basic authorization challenge expected, but not found
05-02 10:28:23.124: D/MainActivity(1169): has excute
05-02 10:28:23.124: E/MainActivity(1169): response error: HTTP/1.1 401 Unauthorized
だから、私の問題はどこにあるか教えてください。前もって感謝します。
Update:ターゲットサーバーはExchange Web Service 2010です。何らかの理由で、EWSAPIを使用したくないので作成しました。サーバーに接続するための自分のxmlリクエスト(このxmlリクエストは正しく機能します)。
そして、リクエストが失敗したときのサーバーからの応答ヘッダーは次のとおりです。
Server Microsoft-IIS/7.5
WWW-Authenticate Negotiate
WWW-Authenticate NTLM
X-Powered-By ASP.NET
Date Fri, 25 May 2012 03:47:57 GMT
Content-Length 0
初めて成功を要求するとき:
Cache-Control private
Transfer-Encoding chunked
Content-Type text/xml; charset=utf-8
Server Microsoft-IIS/7.5
Set-Cookie exchangecookie=1d9d9b1d21064035ad375c8aecde2168; expires=Sat, 25-May-2013 04:00:46 GMT; path=/; HttpOnly
X-AspNet-Version 2.0.50727
X-Powered-By ASP.NET
Date Fri, 25 May 2012 04:00:45 GMT
そして2回目:
Cache-Control private
Transfer-Encoding chunked
Content-Type text/xml; charset=utf-8
Server Microsoft-IIS/7.5
X-EwsPerformanceData RpcC=4;RpcL=0;LdapC=0;LdapL=0;
X-AspNet-Version 2.0.50727
X-Powered-By ASP.NET
Date Fri, 25 May 2012 04:00:47 GMT
クッキーが私の問題ですね。
先週、Android HTTPベーシックに苦労していました。3つか4つの異なる方法を試しましたが、常に問題が見つかりました。今のところ、それを機能させる唯一の方法は最も簡単な方法。
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, pass);
Header header = new BasicScheme().authenticate(credentials, mHttpRequest);
mHttpRequest.addHeader(header);
これはAndroidHttpClientでうまくいきました。
編集:
これは私の完全なソースコードです
https://Gist.github.com/2642692
http://lukencode.com/2010/04/27/calling-web-services-in-Android-using-httpclient/ に基づいています