웹-투-웹 프로그래밍 1

sally·2022년 2월 12일
0

WEB

목록 보기
1/1

URL로부터 데이터 읽기

URL과 URLConnection을 이용한 데이터 전송

  • URLConnection 클래스 : HTTP 프로토콜 기반의 소켓 통신 기능 제공

  • URLConnection 타입을 갖는 인스턴스는 java.net.URL 클래스의 openConnection() 메소드를 통해서 구할 수 있다.

  • java.net.URL 클래스

    • URL로 확인 할 수 있는 것들
      • FTP, HTTP 프로토콜을 포함하여 대부분의 URL을 표현할 수 있도록 해 주고 있다.
  • URL 클래스의 openConnection()을 호출

    • 프로토콜에 따라 URLConnection을 상속한 알맞은 하위 클래스의 인스턴스 반환
    • HTTP 프로토콜에 대해 openConnection() 호출시 : java.net.HttpURLConnection 클래스의 인스턴스를 리턴
    • URLConnection.getInputStream() : URL이 나타내는 사이트로부터 데이터를 읽어 온다.
      • Reader를 통해 읽는다 : InputStream을 사용할 경우 바이트 단위로 데이터를 읽어오기 때문에 한글과 같이 아스키 코드 이외에 글자들이 깨지기 때문이다.
    @Test
	void test_1() throws IOException {
		URL url = new URL("http://www.disney.co.kr");
		URLConnection conn = url.openConnection();
		InputStream is = conn.getInputStream();  // 원격 자원으로부터 데이터를 읽어올 수 있게 된다
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		char[] buff = new char[512];
		int len = -1;

		while( (len = br.read(buff)) != -1) {
			System.out.print(new String(buff, 0, len));
		}
		br.close();
	}
  • URL의 openStream() 내용과 일치한다.

서버에 데이터 전송하기

웹 기반의 데이터 교환

  • 상대방의 웹 사이트에 있는 JSP/PHP/ASP/CGI와 같은 웹 프로그램에 데이터를 전송할 수 있어야 한다.

HTTP 프로토콜 통한 데이터를 전송

  • GET 방식은 URL을 통해서 서버에 전달
  • POST 방식의 경우는 스트림을 통해서 서버에 전달
  • 자바의 서블릿이나 JSP : HttpServletRequest의 getParameter() 통해 클라이언트가 전송한 데이터를 읽어올 수 있다.

GET 방식과 POST 방식의 차이점에 맞춰 서버에 데이터를 전송하는 클래스 역시 각각의 방식을 알맞게 구현

GET 방식으로 데이터 전송하기

  • 각각의 파라미터는 앰퍼샌드 기호(&)를 통해서 분리되며, 각 파라미터의 값은 인코딩된 상태이어야 한다. 파라미터 값의 인코딩은 java.net.URLEncoder 클래스의 static 메소드인 encode() 메소드를 통해서 처리할 수 있다.
  • URLEncoder.encode()
    • java.util.Properties를 파라미터로 받는다.
      • java.util.Properties 클래스
        • <이름, 값> 쌍을 저장할 수 있는 클래스
    • URLConnection.setUseCaches( false )
      • 캐시에 저장된 결과가 아닌 동적으로 그 순간에 생성된 결과를 읽어올 수 있게 된다.
      • 캐시로부터 값을 읽어오지 않는 이유는 파라미터를 전송하는 경우 대부분 웹 페이지의 결과가 그 순간 순간 파라미터의 값에 따라 달라지기 때문이다.

POST 방식으로 데이터 전송하기

  • 스트림을 통해서 파라미터를 전송해야 하기 때문에 URLConnection으로부터 OutputStream을 구해야 한다.
    • connection.setDoOutput(true);
      • URLConnection의 출력 스트림을 사용할지의 여부
    • connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      • 웹 서버는 POST 방식의 데이터가 인코딩된 데이터라는 것을 알 수 있게 된다.
    • new DataOutputStream(connection.getOutputStream());
      • URLConnection.getOutputStream() : 출력 스트림에 파라미터를 인코딩한 문자열을 전송
      • DataOutputStream : 데이터를 전송

웹 기반의 통신 기능을 제공하는 HttpMessage 클래스

캡슐화한 HTTPMessage 클래스

  • HttpMessage 객체를 생성하여 InputStream을 구할 수 있게 된다.
    • sendPostMessage(Properties)나 sendGetMessage(Properties)
    • 전송할 파라미터가 없는 경우에는 sendPostMessage()와 sendGetMessage()
  • HttpMessage 클래스를 사용할 때의 주의점
    • 한글 문제는 자바에서 사용하는 유니코드와 각 규약에 정의되어 있는 내용을 이해하지 못한 되서 비롯되는 경우가 많으며 올바르게 캐릭터셋에 대한 내용을 이해하고 있다면 매우 간단하게 해결할 수 있는 부분이다.
    • 서블릿/JSP 규약에 따라 사용자의 요청 데이터는 자동적으로 iso-8859-1 캐릭터 셋으로 읽허진다. - 깨진 글자로 전달
    • request.getParameter() 메소드를 사용하여 읽어온 값의 캐릭터 셋을 변환
profile
sally의 법칙을 따르는 bug Duck

0개의 댓글