2012-12-04 4 views
9

명확하게 작동하는 HTTP GET 메소드를 개발했습니다. www.google.comAndroid - HTTP GET Request

SCREEN SHOT OF GOOGLE.COM WORKING

다음 코드를 화면에 표시하는 제 검색 방법에서 응답을 검색 할 때 여기

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(); 
       } 
      } 
     } 
} 

내 에뮬레이터의 출력 화면이다.

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"

나는 현재 오류가 다음과 같은 화면을

MY SERVER, NOT WORKING

답변

8

다음은 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(); 
    } 
} 
} 
+0

고마워요. –

+0

@Akdeniz 안녕하세요!, 내가 재현 한 것을 시도했지만 몇 가지 오류가 발생했습니다. 이에 대해 묻는 질문을 게시합니다. 당신은 내가 잘못한 것을 나에게 말할 수 있겠는가 ?? http://stackoverflow.com/questions/23900054/android-php-sending-a-get-request-to-php-server –

5

을 가지고 : 당신이 사용하는

URI website = new URI("https://https://ts.xoomworks.com:8443/XoomworksTimesheets/ping"); 

"은 https : //"를 두 번 누릅니다.

편집 : 나는 내 끝에서 테스트하지 않았다

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; 

,하지만 작동합니다 : 내가 좋아하는 당신의 코드가 보일 것입니다 here

의 코드를 얻었다. 포트 4383 대신 포트 8433을 사용하므로 socketfactory 구성표에서 포트 번호를 변경했습니다.

+1

죄송합니다. 편집 및 수정되었습니다. 여전히 같은 문제. –

+0

google.com 요청을 할 때 https없이 제대로 처리 할 수 ​​있습니까? SSL 연결없이 서버에서 해본 적이 있습니까? –

+0

나는 또한 Facebook을 시도했고 https 프로토콜을 사용합니다. 내 서버가 SSL 연결없이 작동하지 않습니다. 모든 서명되지 않은 인증서를 허용하는 클래스가 있습니다.이 클래스는 안전하지 않습니다. 하지만 내 코드에서이 클래스를 구현하는 방법을 모르겠다. –

2

테이크 관리,이 모든 코드가를 더 이상 사용되지 않습니다 API의 새 버전 !

다음은 새로운 api가있는 http get의 예입니다. 안드로이드 웹 사이트에서

RequestQueue queue = Volley.newRequestQueue(this); 
String url ="http://www.google.com"; 

// Request a string response from the provided URL. 
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     // Display the first 500 characters of the response string. 
     mTextView.setText("Response is: "+ response.substring(0,500)); 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     mTextView.setText("That didn't work!"); 
    } 
}); 
// Add the request to the RequestQueue. 
queue.add(stringRequest); 

출처 : https://developer.android.com/training/volley/simple.html

1

HttpClient가되지 않습니다. 그래서 새로운 방법이해야 할 일 : 먼저, build.gradle에 두 종속성을 추가 :

compile 'org.apache.httpcomponents:httpcore:4.4.1' 
compile 'org.apache.httpcomponents:httpclient:4.5' 

그런 다음 doBackground 방법 ASyncTask에서이 코드를 작성합니다.

URL url = new URL("http://localhost:8080/web/get?key=value"); 
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); 
urlConnection.setRequestMethod("GET"); 
int statusCode = urlConnection.getResponseCode(); 
if (statusCode == 200) { 
     InputStream it = new BufferedInputStream(urlConnection.getInputStream()); 
     InputStreamReader read = new InputStreamReader(it); 
     BufferedReader buff = new BufferedReader(read); 
     StringBuilder dta = new StringBuilder(); 
     String chunks ; 
     while((chunks = buff.readLine()) != null) 
     { 
     dta.append(chunks); 
     } 
} 
else 
{ 
    //Handle else 
} 

: 코드에서 예외를 처리하는 것을 잊지 마십시오.