2010-10-01 110 views
0

我想通过https连接从服务器获取xml。如果我用curl命令做它Android java.net.UnknownHostException:主机无法解析:server_address:443

curl -k -A "Mozilla/4.0" https://username:[email protected]/test/infoxml.ashx 

连接是成功的,但是当我在android上尝试java时,它不起作用。我使用此代码:

URL url = new URL("https://user:[email protected]"); 
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); 
conn.setRequestMethod("GET"); 
conn.setRequestProperty("Authorization", "Basic **********************"); 
conn.setRequestProperty("User-Agent", "Mozilla/4.0"); 
conn.setRequestProperty("Host", "server.com"); 
conn.setRequestProperty("Accept", "*/*"); 

InputStream content = conn.getInputStream(); 

正如你所看到的,我设置了标题根据工作curl命令的详细输出,主要内容如下:

* About to connect() to server.com port 443 (#0) 
* Trying (server ip)... connected 
* Connected to server.com (server ip) port 443 (#0) 
* SSLv3, TLS handshake, Client hello (1): 
* SSLv3, TLS handshake, Server hello (2): 
* SSLv3, TLS handshake, CERT (11): 
* SSLv3, TLS handshake, Server finished (14): 
* SSLv3, TLS handshake, Client key exchange (16): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSLv3, TLS change cipher, Client hello (1): 
* SSLv3, TLS handshake, Finished (20): 
* SSL connection using AES256-SHA 
* Server certificate: 
* subject: C=SI; ST=City; L=City; O=Company d.d; OU=ES; CN=server.com 
* start date: 2010-02-05 00:00:00 GMT 
* expire date: 2011-02-02 23:59:59 GMT 
* common name: server.com (matched) 
* issuer: C=ZA; ST=Western Cape; L=Cape Town; O=Thawte Consulting cc; OU=Certification Services Division; CN=Thawte Premium Server CA; emailAddress=censored 
* SSL certificate verify ok. 
* Server auth using Basic with user 'username' 
> GET /test/infoxml.ashx HTTP/1.1 
> Authorization: Basic **************************** 
> User-Agent: Mozilla/4.0 
> Host: server.com 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Connection: Keep-Alive 
< X-Powered-By: ASP.NET 
< X-AspNet-Version: 2.0.50727 
< Keep-Alive: timeout=5, max=100 
< Server: Microsoft-IIS/6.0 
< Cache-Control: private 
< Set-Cookie: JSESSIONID=abcs8ebwPsf-A-biM7KTs; path=/ 
< Content-Type: text/xml; charset=utf-8 
< Content-Length: 1688 
< Date: Thu, 30 Sep 2010 23:16:06 GMT 
< 
* Connection #0 to host server.com left intact 
* Closing connection #0 
* SSLv3, TLS alert, Client hello (1): 
<?xml version="1.0"... 

我是新来的这安全连接的东西,所以容易对我:)

ps对不起,我的英语不好。

回答

0

尝试如下所示。对于HttpRequestInterceptor后面的理由,请参阅this blog post on "Http Basic Authentication with Android"。我没有尝试过这些代码,但它是我使用过的基本认证部分的一部分工作代码的集合。

SchemeRegistry supportedSchemes = new SchemeRegistry(); 
supportedSchemes.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
supportedSchemes.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 

HttpParams params = new BasicHttpParams(); 
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
HttpProtocolParams.setContentCharset(params, "UTF-8"); 
HttpProtocolParams.setUseExpectContinue(params, true); 
HttpProtocolParams.setUserAgent(params, "Android App"); 

ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, supportedSchemes); 
AbstractHttpClient httpClient = new DefaultHttpClient(connectionManager, params); 

HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() { 
    @Override 
    public void process(HttpRequest request, 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); 
      } 
     } 
    } 
}; 

httpClient.addRequestInterceptor(preemptiveAuth, 0); 

Credentials creds = new UsernamePasswordCredentials("username", "password"); 
httpClient.getCredentialsProvider().setCredentials(new AuthScope(null, -1, AuthScope.ANY_REALM), creds); 

HttpHost host = new HttpHost("server.com", 443, "https"); 
HttpGet httpGet = new HttpGet("https://server.com/test/infoxml.ashx"); 
HttpResponse httpResponse = httpClient.execute(host, httpGet); 

HttpEntity responseEntity = httpResponse.getEntity(); 
InputStream content = responseEntity.getContent(); 
+0

试过这一个,没有运气...它抛出“的java.net.UnknownHostException:https://server.com”异常.. – Alen 2010-10-01 10:33:06

+0

它可以让你与你的真实服务器异常?我假设“server.com”不是您的域名。 – Brian 2010-10-01 15:38:29

+0

我正在为Android编写一个小部件应用程序,它连接到移动运营商服务并返回一些信息。不,server.com绝对不是真正的域名。 – Alen 2010-10-01 17:32:58