I have developed a HTTP GET Method that clearly works.
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();
}
}
}
}
Here is a print screen of my emulator when retrieving a response from www.google.com
SCREEN SHOT OF GOOGLE.COM WORKING
The following code is my retrieval method to display it on screen.
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);
}
However, when I try it with my own server.
"https://server:port/xwtimesheets/ping"
I have the following screen
MY SERVER, NOT WORKING
Here is edited version of your GetMethodEx class. MySSLSocketFactory allows you to connect any server without checking their certificate. As you know it, this is not safe. I recommend you to add your servers' certificate as trusted to your device.
By the way your servers certificate validity date is expired. Even if you add it as trusted, you may not connect to your server.
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();
}
}
}
You have an error here:
URI website = new URI("https://https://ts.xoomworks.com:8443/XoomworksTimesheets/ping");
You are using "https://" twice.
EDIT: I got the code from here
Your code should look like:
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
DefaultHttpClient client = new DefaultHttpClient();
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 8443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());
// Set verifier
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
// Example send http request
final String url = "https://ts.xoomworks.com:8443/XoomworksTimesheets/ping/";
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost);
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;
I did not test it on my end, but it should work. Note you are using the port 8433 instead of 433, so I changed it in the socketfactory scheme.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With