Android-HttpURLConnection 과 HttpClien

Android 의 네트워크 통신 방식 은 두 가지 가 있 습 니 다.Socket 이나 HTTP 를 사용 하고 HTTP 는 두 가지 방식 으로 프로 그래 밍 방식 을 포함 합 니 다.
(1)HttpUrlConnection;
(2)HttpClient;
1.HttpURLConnection
HttpURLConnection 은 다 용도,경 량 극 의 HTTP 클 라 이언 트 로 이 를 사용 하여 HTTP 작업 을 하면 대부분의 응용 프로그램 에 적용 할 수 있 습 니 다.HttpURLConnection 의 API 는 비교적 간단 하지만 동시에 우 리 는 그것 을 더욱 쉽게 사용 하고 확장 할 수 있 습 니 다.
HttpURLConnection 을 사용 하 는 절 차 는 다음 과 같 습 니 다.
1)URL 대상 만 들 기: URL url = new URL(http://www.baidu.com);
2)HttpURLConnection 대상 의 인 스 턴 스 를 가 져 오기 위해 URL 대상 의 openConnection()을 호출 합 니 다. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3)HTTP 요청 사용 방법 설정:GET 또는 POST 또는 기타 요청 방법:PUT conn.setRequestMethod("GET");
4)연결 시간 초과,시간 초과 밀리초 읽 기,서버 에서 원 하 는 메시지 헤더 설정 conn.setConnectTimeout(6*1000);conn.setReadTimeout(6 * 1000);
5)getInputStream()방법 을 호출 하여 서버 가 되 돌아 오 는 입력 흐름 을 얻 은 다음 입력 흐름 을 읽 습 니 다. InputStream in = conn.getInputStream();
6)마지막 으로 disconnect()방법 으로 HTTP 연결 끄 기 conn.disconnect();
HttpURLConnection 은 다음 과 같은 세 가지 사용 장면 이 있 습 니 다.
1.HttpURLConnection 연결 URL,웹 데이터 가 져 오기(예:브 라 우 저 등)
1)URL 대상 만 들 기
URL url = new URL(http://www.baidu.com);
2)HttpURLConnection 대상 을 이용 하여 인터넷 에서 웹 데이터 가 져 오기
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3)연결 시간 초과 설정
conn.setConnectTimeout(6*1000);
4)응답 코드 에 대한 판단
if (conn.getResponseCode() != 200)    //인터넷 에서 웹 페이지 를 가 져 오고 요청 을 보 내 며 웹 페이지 를 스 트림 으로 읽 습 니 다.
throw new RuntimeException("요청 url 실패");
5)네트워크 에서 되 돌아 오 는 입력 흐름
InputStream is = conn.getInputStream(); 6)String result = readData(is, "GBK"); //파일 흐름 입력 파일 용 outStream.write 7)conn.disconnect();
요약:-연결 시간 초과 설정 을 기억 합 니 다.네트워크 가 좋 지 않 으 면 Android 시스템 은 기본 시간 을 초과 하면 자원 중단 작업 을 회수 합 니 다.-되 돌아 오 는 응답 코드 200 은 성공 입 니 다.-Android 에서 파일 흐름 에 대한 작업 은 JAVA SE 와 같 습 니 다.-큰 파일 을 조작 할 때 SD 카드 에 파일 을 쓰 고 핸드폰 메모리 에 직접 쓰 지 마 십시오.-큰 파일 을 조작 하 는 것 은...한 번 은 인터넷 에서 읽 어야 하고,한 번 은 SDCard 에 써 야 하 며,휴대 전화 메모리 의 사용 을 줄 여야 합 니 다.이 점 은 매우 중요 합 니 다.면접 에서 자주 질문 을 받 습 니 다.-파일 흐름 이 끝나 면 제때에 닫 아야 합 니 다.
2.인터넷 에 요청 파 라 메 터 를 보 냅 니 다(요청 파 라 메 터 를 제출 하고 get 과 post 두 가지 방식 이 있 습 니 다)
단계:1)URL 대상 만 들 기:URL realUrl=new URL(requestUrl);2)HttpURLConnection 대상 을 통 해 네트워크 주소 로 요청 발송
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); 3)출력 허용 설정:conn.setDoOutput(true);4)캐 시 를 사용 하지 않 는 설정:conn.setUseCaches(false);5)POST 방식 으로 보 내기 설정:conn.setRequestMethod("POST");6)긴 연결 유지 설정:conn.setRequestProperty("연결","Keep-Alive");7)파일 문자 집합 설정:conn.setRequestProperty("Charset","UTF-8");8)파일 길이 설정:conn.setRequestProperty("Content-Length",String.valueOf(data.length);9)파일 형식 설정:conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");10)스 트림 으로 출력 합 니 다.요약:-POST 요청 을 보 내 려 면 출력 허용 을 설정 해 야 합 니 다.캐 시 를 사용 하지 마 십시오.문제 가 발생 하기 쉽 습 니 다.--HttpURLConnection 대상 의 setRequestProperty()설정 을 시작 하면 HTML 파일 헤드 를 생 성 하 는 것 입 니 다.
3.인터넷 에 xml 데이터 보 내기
XML 형식 은 통신 의 표준 언어 이 며,Android 시스템 도 XML 파일 을 보 내 데 이 터 를 전송 할 수 있 습 니 다.1)생 성 된 XML 파일 을 byte 배열 에 기록 하고 UTF-8:byte[]xmlbyte=xml.toString().getBytes("UTF-8")로 설정 합 니 다.2)URL 대상 을 만 들 고 주소 와 인 자 를 지정 합 니 다:URL url=new URL(http://localhost:8080/itcast/contanctmanage.do?method=readxml); 3)링크 획득:HttpURLConnection conn=(HttpURLConnection)url.openConnection();4)연결 시간 초과 설정:conn.setConnectTimeout(6*1000);5)conn.setDoOutputs(true)를 출력 할 수 있 도록 설정 합 니 다.6)캐 시 를 사용 하지 않 는 설정:conn.setUseCaches(false);7)POST 방식 으로 전송 설정:conn.setRequestMethod("POST");            8)긴 연결 유지:conn.setRequestProperty("연결","Keep-Alive");9)문자 집합 설정:conn.setRequestProperty("Charset","UTF-8");10)파일 의 총 길 이 를 설정 합 니 다:conn.setRequestProperty("Content-Length",String.valueOf(xmlbyte.length);11)파일 형식 설정:conn.setRequestProperty("Content-Type","text/xml;charset=UTF-8"); 12)파일 흐름 으로 xml 데 이 터 를 보 냅 니 다:outStream.write(xmlbyte);요약:우리 가 사용 하 는 것 은 HTML 방식 으로 파일 을 전송 하 는 것 입 니 다.이 방식 은 보통 5M 에 있 는 파일 만 전송 할 수 있 습 니 다.-큰 파일 을 전송 하 는 것 은 HTML 방식 에 적합 하지 않 습 니 다.큰 파일 을 전송 하 는 것 은 Socket 을 대상 으로 프로 그래 밍 해 야 합 니 다.프로그램의 안정성 을 확보 합 니 다.주소 와 파 라 메 터 를 by te 배열 에 저장 합 니 다.by te[]data=params.toString().getBytes();
2.HttpClient
HttpClient 는 DefaultHttpClient 와 AndroidHttpClient 두 가지 구체 적 인 실현 클래스 를 가지 고 있 습 니 다.모두 많은 API 가 있 고 안정 적 이 며 bug 수량 도 적 습 니 다.그러나 HttpClient 의 API 수량 이 너무 많아 서 호환성 을 파괴 하지 않 고 업그레이드 하고 확장 하기 어렵 기 때문에 현재 안 드 로 이 드 개발 팀 은 HttpClient 의 업무 태 도 를 향상 시 키 고 최적화 하 는 데 적 극 적 이지 않다.
HttpClient 를 사용 하려 면 다음 과 같은 6 단계 가 필요 합 니 다.
1.HttpClient 의 인 스 턴 스 만 들 기
2.어떤 연결 방법의 인 스 턴 스 를 만 듭 니 다.여기 서 GetMethod 입 니 다.GetMethod 의 구조 함수 에 연결 할 주 소 를 입력 합 니 다.
3.첫 번 째 단계 에서 만 든 인 스 턴 스 의 execute 방법 을 호출 하여 두 번 째 단계 에서 만 든 method 인 스 턴 스 를 실행 합 니 다.
4.응답 읽 기
5.연결 해제.실행 방법 이 성공 하 든 안 하 든 연결 을 풀 어야 합 니 다.
6.얻 은 내용 을 처리한다
1.웹 데이터 가 져 오기(예:브 라 우 저 등)
public class SimpleClient {
public static void main(String[] args) throws IOException 
{
  HttpClient client = new HttpClient(); 
      //                   
      //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port); 
      //    GET    ,          HTTPS   ,        URL    http    https 
         HttpMethod method=new GetMethod("http://java.sun.com");
      //  POST  
      //HttpMethod method = new PostMethod("http://java.sun.com");
      client.executeMethod(method);

      //          
      System.out.println(method.getStatusLine());
      //       
      System.out.println(method.getResponseBodyAsString());
      //    
      method.releaseConnection();
   }
}

2.인터넷 에 요청 파 라 메 터 를 보 냅 니 다(요청 파 라 메 터 를 제출 하고 get 과 post 두 가지 방식 이 있 습 니 다)
private void PostByHttpClient(final String url)
{
    new Thread()
    {
        public void run() 
        {
            try{
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("user", "   "));
                params.add(new BasicNameValuePair("pawd", "123"));
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,"UTF-8");
                httpPost.setEntity(entity);
                HttpResponse httpResponse =  httpClient.execute(httpPost);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity2 = httpResponse.getEntity();
                    detail = EntityUtils.toString(entity2, "utf-8");
                    handler.sendEmptyMessage(SHOW_DATA);
                }
            }catch(Exception e){e.printStackTrace();}
        };
    }.start();
}

좋은 웹페이지 즐겨찾기