我开发了一个清晰的HTTP GET方法.
public class GetMethodEx { public String getInternetData() throws Exception{ new TrustAllManager(); new TrustAllSSLSocketFactory(); BufferedReader in = null; String data = null; try { HttpClient client = new DefaultHttpClient(); URI website = new URI("https://server.com:8443/Timesheets/ping"); HttpGet request = new HttpGet(); request.setURI(website); HttpResponse response = client.execute(request); response.getStatusLine().getStatusCode(); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String l = ""; String nl = System.getProperty("line.separator"); while ((l = in.readLine()) !=null){ sb.append(l + nl); } in.close(); data = sb.toString(); return data; } finally{ if (in != null){ try{ in.close(); return data; }catch (Exception e){ e.printStackTrace(); } } } }
在从www.google.com获取响应时,这是我的模拟器的打印屏幕
SCREEN SHOT OF GOOGLE.COM WORKING
public class Home extends Activity { TextView httpStuff; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.httpexample); httpStuff = (TextView) findViewById(R.id.tvhttp); new LongOperation().execute(""); } private class LongOperation extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... params) { GetMethodEx test = new GetMethodEx(); String returned = null; try { returned = test.getInternetData(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return returned; } @Override protected void onPostExecute(String result) { httpStuff.setText(result); }
但是,当我用自己的服务器尝试它.
“https://server:port/xwtimesheets/ping”
我有以下屏幕
解决方法
这是您的GetMethodEx类的编辑版本. MySSLSocketFactory允许您连接任何服务器而不检查其证书.如你所知,这不安全.我建议您将服务器的证书添加到您的设备中.
顺便说一句,您的服务器证书有效期已过.即使将其添加为可信任,也可能无法连接到服务器.
public class GetMethodEx { public String getInternetData() throws Exception { BufferedReader in = null; String data = null; try { HttpClient client = new DefaultHttpClient(); client.getConnectionManager().getSchemeRegistry().register(getMockedScheme()); URI website = new URI("https://server.com:8443/XoW"); HttpGet request = new HttpGet(); request.setURI(website); HttpResponse response = client.execute(request); response.getStatusLine().getStatusCode(); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String l = ""; String nl = System.getProperty("line.separator"); while ((l = in.readLine()) != null) { sb.append(l + nl); } in.close(); data = sb.toString(); return data; } finally { if (in != null) { try { in.close(); return data; } catch (Exception e) { Log.e("GetMethodEx",e.getMessage()); } } } } public Scheme getMockedScheme() throws Exception { MySSLSocketFactory mySSLSocketFactory = new MySSLSocketFactory(); return new Scheme("https",mySSLSocketFactory,443); } class MySSLSocketFactory extends SSLSocketFactory { javax.net.ssl.SSLSocketFactory socketFactory = null; public MySSLSocketFactory(KeyStore truststore) throws Exception { super(truststore); socketFactory = getSSLSocketFactory(); } public MySSLSocketFactory() throws Exception { this(null); } @Override public Socket createSocket(Socket socket,String host,int port,boolean autoClose) throws IOException,UnknownHostException { return socketFactory.createSocket(socket,host,port,autoClose); } @Override public Socket createSocket() throws IOException { return socketFactory.createSocket(); } javax.net.ssl.SSLSocketFactory getSSLSocketFactory() throws Exception { SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null,new TrustManager[] { tm },null); return sslContext.getSocketFactory(); } } }