심 플 한 아름다움 Jod-http--한 광주리 적용

16370 단어 http
Jod-Huttp 는 미니 어 처 하고 심 플 한 http client 이지 만 간단 하고 편리 합 니 다.이 를 사용 하면 요청 을 보 내 고 응답 을 읽 을 수 있 습 니 다.일상적인 응용 이 간단 해 져 개발 자의 업 무 를 간소화 하 는 것 이 목표 다.
Jod-Huttp 를 이해 하 는 가장 좋 은 방법 은 예시 프로그램 이다.
간단 한 GET 방법
    HttpRequest httpRequest = HttpRequest.get("http://jodd.org");

    HttpResponse response = httpRequest.send();



    System.out.println(response);

이 코드 는 get 요청 을 실현 하고 응답 결 과 를 출력 합 니 다.
응답 결 과 를 살 펴 보 겠 습 니 다.
HTTP/1.1 200 OK

Date: Fri, 12 Jun 2015 02:43:50 GMT

Server: Apache

Last-Modified: Mon, 25 May 2015 21:44:44 GMT

Accept-Ranges: bytes

Content-Length: 14056

Cache-Control: max-age=0, public

Expires: Fri, 12 Jun 2015 02:43:50 GMT

Vary: Accept-Encoding

Connection: close

Content-Type: text/html; charset=utf-8



<!DOCTYPE html>

<html>

<head>

..................................

...................................

</body>

</html>

다음 그림 과 결합 하여 이해 해 주세요.
wKiom1MpmHWALc2UAADu14JLceA655.jpg
너 도 이렇게 쓸 수 있다.
    HttpResponse response = HttpRequest.get("http://jodd.org").send();



    System.out.println(response);

또는 한 걸음 한 걸음 구축:
    HttpRequest request = new HttpRequest();

    request

        .method("GET")

        .protocol("http")

        .host("srv")

        .port(8080)

        .path("/api/jsonws/user/get-user-by-id");

좋아,요청 한 스타일 을 알 아 보 자.
wKioL1MpX-qwK1-PAAExXPRpR8M814.jpg
응답 메시지 읽 기
   메 시 지 를 보 낸 후 응답 메 시 지 를 HttpResponse 인 스 턴 스 에 저장 하면 HttpResponse 방법 으로 status Code,statusPhrase 。를 얻 을 수 있 습 니 다.
  메시지 자 체 를 읽 는 방법 은 주로 세 가지 가 있 습 니 다.
  body()-보통 ISO-8859-1 인 코딩 형식의 기본 메시지 내용 입 니 다.
  bodyText()-메시지 헤더'Content-type'속성 값 의 인 코딩 형식 에 따라 컴 파일 된 메시지 입 니 다.
  BodyByte()-저장 할 파일 을 다운로드 하 는 등 바이트 배열 로 되 돌아 오 는 기본 메시지 입 니 다.
메모:bodyText()방법 을 사용 하기 전에 charset()방법 으로 인 코딩 형식 을 지정 해 야 합 니 다.
조회 매개 변수
get 방법 에서 조회 파 라 메 터 는 url 에서 지정 할 수 있 습 니 다(정확 한 인 코딩 이 필요 합 니 다).예 를 들 어:
    HttpResponse response = HttpRequest

        .get("http://srv:8080/api/jsonws/user/get-user-by-id?userId=10194")

        .send();

또는 query()방법 으로 설정 합 니 다.예 를 들 어:
    HttpResponse response = HttpRequest

        .get("http://srv:8080/api/jsonws/user/get-user-by-id")

        .query("userId", "10194")

        .send();

하나의 매개 변 수 를 설정 하면 query()방법 을 사용 하거나 매개 변수 마다 query()방법 을 호출 할 수 있 습 니 다.
물론 맵을 매개 변수 로 전달 할 수도 있 습 니 다.
메모:조회 매개 변수(메시지 헤더 나 폼 매개 변수)는 중복 할 수 있 습 니 다.내부 에 그것들 은 배열 에 저장 되 어 있다.removeQuery 방법 을 사용 하여 파 라 메 터 를 삭제 하거나 query 방법 을 여러 번 호출 하여 파 라 메 터 를 교체 합 니 다.
query 는 모든 내부 인 자 를 읽 을 수 있 습 니 다:
    Map<String, Object[]> httpParams = request.query();

    httpParams.put("userId", new String[] {"10194"});

기본 인증
기본 인증 은 매우 간단 합 니 다.
request.basicAuthentication("test", "test");

post 방법 과 폼 매개 변수
get 방법 중의 query 와 유사 합 니 다:
    HttpResponse response = HttpRequest

        .post("http://srv:8080/api/jsonws/user/get-user-by-id")

        .form("userId", "10194")

        .send();

post 방법 에서 폼 인 자 를 form 으로 지정 하 는 것 을 알 수 있 습 니 다.form 사용 방법 은 query 사용 방법 과 완전히 같 습 니 다.
파일 업로드
마찬가지 로 파일 을 form 매개 변수 에 추가 하기 도 쉽 습 니 다.예 는 다음 과 같다.
    HttpRequest httpRequest = HttpRequest

        .post("http://srv:8080/api/jsonws/dlapp/add-file-entry")

        .form(

            "repositoryId", "10178",

            "folderId", "11219",

            "sourceFileName", "a.zip",

            "mimeType", "application/zip",

            "title", "test",

            "description", "Upload test",

            "changeLog", "testing...",

            "file", new File("d:\\a.jpg.zip")

        );



    HttpResponse httpResponse = httpRequest.send();

위 에 코드 가 전부 야.
파일 업로드 진행 모니터링
큰 파일 을 업로드 할 때 업로드 진 도 를 감시 해 야 합 니 다.HttpProgressListener :
    HttpResponse response = HttpRequest

        .post("http://localhost:8081/hello")

        .form("file", file)

        .monitor(new HttpProgressListener() {

            @Override

            public void transferred(long len) {

                System.out.println(len/size);

            }

        })

        .send();

파일 업로드 전,HttpProgressListener callbackSize--- 。 1% 。 , 512 。  HttpProgressListener size, 。 : size , , size ( )。
메시지 헤더
메시지 헤더 인 자 를 추가 하거나 가 져 오 면 header()방법 을 사용 할 수 있 습 니 다.일부 일반적인 메시지 헤더 매개 변 수 는 이미 정의 되 었 기 때문에 contentType()등 유사 한 방법 으로 조회 할 수 있 습 니 다.
압축,압축 해제 메시지
unzip()압축 해제 메시지 예제 사용 하기
    HttpResponse response = HttpRequest

        .get("http://www.liferay.com")

        .acceptEncoding("gzip")

        .send();



    System.out.println(response.unzip());

body 방법 사용 하기
요청 메시지 의 내용 을 수 동 으로 설정 할 수 있 습 니 다.일부 api 는 body 에서 유사 한 명령 을 가리 킬 수 있 습 니 다.
    HttpResponse response = HttpRequest

        .get("http://srv:8080/api/jsonws/invoke")

        .body("{'$user[userId, screenName] = /user/get-user-by-id' : {'userId':'10194'}}")

        .basicAuthentication("test", "test")

        .send();

body 를 설정 한 후 위의 form()방법 을 버 리 고 파 라 메 터 를 설정 할 수 있 습 니 다.
그러나 HttpResponse 에서 body()방법 으로 메시지 내용 을 받 아들 이 는 것 이 더욱 의미 가 있다.
문자 와 인 코딩 형식
기본적으로 query 와 form 인 자 는 utf-8 인 코딩 을 사용 합 니 다.전역 적 으로 JoddHttp 를 통 해 다시 설정 하거나 부분 적 으로 다음 과 같 습 니 다.
    HttpResponse response = HttpRequest

        .get("http://server/index.html")

        .queryEncoding("CP1251")

        .query("param", "value")

        .send();

물론 form 의 인 코딩 형식 을 비슷 한 방식 으로 설정 할 수 있 습 니 다.더 나 아가 폼 을 제출 할 때 메시지 헤더'Content-type'의 값 을 감지 하고 존재 하면 이 값 을 사용 합 니 다.메 시 지 를 받 을 때 body()방법 은 보통 ISO-8859-1 인 코딩 형식의 메 시 지 를 되 돌려 줍 니 다.지정 한 형식 으로 돌아 가 려 면 bodyText()방법 을 사용 할 수 있 습 니 다.이 때 인 코딩 형식 인'Content-type'의 값 을 미리 설정 해 야 합 니 다.
HttpConnection
HttpConnection 은 http 물리 통신 의 인 터 페 이 스 를 봉인 하고 send()방법 을 호출 할 때 http 는 open()을 연결 합 니 다(이 연결 이 존재 하지 않 을 때).내부 에 HttpConnectionProvier 가 이 연결 을 만 듭 니 다.이전 글(간략 한 미 Jod-http--깊이 있 는 소스 이해 http 프로 토 콜)을 참조 하 십시오.기본 연결 공급 자 는 socket 기반 입 니 다.새로 만 든 SocketHttpConnection 인 스 턴 스 를 되 돌려 줍 니 다.이 인 스 턴 스 는 열 린 socket 을 간단하게 포장 합 니 다.사용자 정의 HttpConnection Provider 를 사용 할 수도 있 습 니 다.예 를 들 어 SocketHttpConnection Provider 를 확장 하고 createScket()방법 을 다시 써 서 socket 풀 에서 socket 을 되 돌려 주거 나 만 료 된 시간 이 다른 socket 을 되 돌려 줄 수도 있 습 니 다.
Socket
상기 와 같이 http 통신 은 일반적인 socket 을 통 해 이 루어 집 니 다.따라서 데 이 터 를 보 내기 전에 socket 의 행동 을 바 꿀 수 있 습 니 다.http 가 socket 행 위 를 어떻게 바 꾸 는 지 보 여 줍 니 다.
SocketHttpConnection
  httpConnection 을 통 해 socket 호출:
    HttpRequest request = HttpRequest.get()...;

    request.open();

    SocketHttpConnection httpConnection =

        (SocketHttpConnection) request.httpConnection();

    Socket socket = httpConnection.getSocket();

    socket.setSoTimeout(1000);

    ...

    HttpResponse response = request.send();

SocketHttpConnectionProvider
  또 다른 방법 은 SocketHttpConnection Provider 로 자신의 provider 를 만 드 는 것 입 니 다.
    public class MyConnectionProvider extends SocketHttpConnectionProvider {

        protected Socket createSocket(

                SocketFactory socketFactory, String host, int port)

                throws IOException {

            Socket socket = super.createSocket(socketFactory, host, port);

            socket.setSoTimeout(1000);

            return socket;

        }

    }

그리고 open 방법 으로 socket 가 져 오기
    HttpConnectionProvider connectionProvider = new MyConnectionProvider();

    ...

    HttpRequest request = HttpRequest.get()...;

    HttpResponse response = request.open(connectionProvider).send();

모든 통신 에 사용자 정의 connection Provider 의 기본 Connection Provider 를 설정 하려 면 JoddHttp.httpConnection Provider 에 게 open()방법 을 명시 적 으로 호출 하지 않 아 도 됩 니 다.
지속 연결(keep-alive)
기본적으로 모든 연결 이 닫 혔 습 니 다.http 연결 을 keep-alive 모드 로 설정 하여 연결 이 계속 존재 하도록 합 니 다.keep-alive 모드 에서 통신 세 션 에서 첫 번 째 요청 시 HttpConnection 을 열 고 이 연결 을 다시 사용 합 니 다.필요 하지 않 으 면 socket 이 다시 열 리 지 않 기 때문에 여러 request 에 의 해 중복 사용 할 수 있 습 니 다.
할 수 있 는 방법 은 많 지만 가장 간단 한 방법 은 다음 과 같다.
        HttpRequest request = HttpRequest.get("http://jodd.org");

        HttpResponse response = request.connectionKeepAlive(true).send();



        // next request

        request = HttpRequest.get("http://jodd.org/jodd.css");

        response = request.keepAlive(response, true).send();



        ...



        // last request

        request = HttpRequest.get("http://jodd.org/jodd.png");

        response = request.keepAlive(response, false).send();



        // optionally

        //response.close();

대리
HttpConnectionProvider 는 프 록 시 정보(유형,주소,포트,사용자 이름,비밀번호)를 가리 키 는 ProxyInfo 인 스 턴 스 만 제공 하면 됩 니 다.HTTP/SOCKKS 4/SOCKET 5 세 가지 유형 을 지원 합 니 다.그 차이 점 은:
SOCKS:방화벽 보안 세 션 변환 프로 토 콜(Socks:Protocol for sessions traversal across firewall securely)Socks 프로 토 콜 은 TCP 와 UDP 도 메 인 에 있 는 클 라 이언 트/서버 응용 프로그램 이 네트워크 방화벽 이 제공 하 는 서 비 스 를 더욱 편리 하고 안전하게 사용 할 수 있 는 프레임 워 크 를 제공 합 니 다.이 프로 토 콜 은 개념 적 으로 응용 층 과 전송 층 사이 에 있 는'중개 층(shim-layer)'이기 때문에 ICMP 정보 전달 과 같은 네트워크 계층 게 이 트 웨 이 서 비 스 를 제공 하지 않 습 니 다.Socks 4 와 Socks 5 는 모두 Socks 프로 토 콜 에 속 하지만 지원 하 는 구체 적 인 응용 에 따라 차이 가 있 습 니 다.Socks 4 프 록 시 는 TCP 애플 리 케 이 션 만 지원 하고 Socks 5 프 록 시 는 TCP 와 UDP 두 가지 애플 리 케 이 션 을 지원 합 니 다.그러나 Socks 5 프 록 시 는 각종 인증 체제,서버 엔 드 도 메 인 이름 분석 등 을 지원 합 니 다.반면 Socks 4 대 리 는 없 기 때문에 대외 적 으로 개방 되 는 Socks 대 리 는 모두 Socks 4 대리 이다.따라서 UDP 애플 리 케 이 션 은 일반적으로 지원 되 지 않 는 다.즉,Socks 4 가 할 수 있 는 Socks 5 는 다 할 수 있 지만,Socks 5 가 할 수 있 는 것 은 Socks 4 가 꼭 다 할 수 있 는 것 은 아니다.
 입력 흐름 분석
   HttpRequest 와 HttpResponse 는 입력 흐름 을 읽 는 방법 readFrom(InputStream)를 실현 합 니 다.서버 가 요청 을 어떻게 읽 는 지 예 를 들 어 설명 한다.
HttpBrowser
   대상 주 소 를 바 꾸 어'이동'장면 을 모 의 해 야 할 때 요청 을 보 내 고 응답 을 받 는 것 만 으로 는 부족 합 니 다.예 를 들 어 로그 인 은 현재 session 에서 서로 다른 대상 주소 의 내용 을 읽 어야 합 니 다.
  Http Browser 는 이런 기능 을 완성 할 수 있 습 니 다.이 는 요청 을 보 내 고 301 과 302 점프 를 자동 으로 처리 하 며 응답 메시지 에서 cookies 를 읽 고 새로운 요청 메시지 에 저장 하 는 등 을 읽 습 니 다.간단 한 예 는 다음 과 같다.
    HttpBrowser browser = new HttpBrowser();



    HttpRequest request = HttpRequest.get("www.facebook.com");

    browser.sendRequest(request);



    // request is sent and response is received



    // process the page:

    String page = browser.getPage();



    // create new request

    HttpRequest newRequest = HttpRequest.post(formAction);



    browser.sendRequest(newRequest);

HttpTunnel
   jod-Huttp 는 http 터널 을 유연 하 게 구축 하 는 방법(간단 한 에이전트 와 목적 주소 의 터널)을 제공 합 니 다.Http Tunnel 은 이 기능 을 실현 합 니 다.
참고 문헌:
【1】 http://jodd.org/doc/http.html
【2】http://www.it165.net/admin/html/201403/2541.html
【3】http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
【4】http://www.ccproxy.com/socks4-yu-socks5-de-qu-bie-jie-shao.htm

좋은 웹페이지 즐겨찾기