이번 강좌에서는 .NET 에서의 HTTP에 관해서 알아 봅니다. 요즘은 거의 모든 것들이 HTTP와 관련이 있으므로 유용하게 이용될 수 있을것 같습니다.
표준 소켓이나 TCP 클래스를 이용하여 직접 HTTP 프로토콜을 구현 할 수 있지만 .NET 은 HTTP 서버와의 통신을 수행 할 수 있도록 설계된 다양한 클래스를 제공 합니다..( 주로 System.Net 네임스페이스 안에 있다 .) 이 클래스들은 일반적인 요청 응답 모델을 구현 하고 있으며 HTTP 전용 기능에 대하여 세밀한 제어가 가능 하도록 추가 속성을 가지고 있습니다.
Class
|
NameSpace
|
Base Class
|
Description
|
HttpWebRequest
|
System.Net
|
WebRequest
|
HTTP 요청을 나타냄
|
HttpWebResponse
|
System.Net
|
WebResponse
|
HTTP 응답을 나타냄
|
WebClient
|
System.Net
|
Component
|
파일이나 데이터를 URI 로 보낼 수 있고 , URI 로부터 데이터를 받을 수 있는 메소드 제공
|
Uri
|
System
|
MarchalByRefObject
|
URI 를 나타내며 호스트명과 절대경로와 같은 URI 의 구성 부분을 쉽게 이용 할 수 있다 .
|
UriBuilder
|
System
|
Object
|
Uri 객체를 생성하고 수정 할 수 있는 Utility 클래스
|
ServicePoint
|
System.Net
|
Object
|
주어진 Uri 에 대한 연결을 관리
|
ServiePointManager
|
System.Net
|
Object
|
ServicePoint 를 관리
|
--------------------------------
HttpWebRequest, HttpWebResponse
--------------------------------
.NET Framework 에서는 HTTP 를 간편하게 이용 할 수 있도록 HttpWebRequest 와 HttpWebResponse 를 기본 클래스로 제공합니다 . 우선 아래의 예제를 보도록 하죠^^;
using System;
using System.Net;
using System.IO;
using System.Text;
class SimpleWebRequest {
public static void Main () {
string query = "http://www.daum.net";
// 주어진 URI 를 조사 후 WebRequest 객체를 돌려 준다 .
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(query);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
// 인코딩의 확실 한 방법은 Content-Encoding 헤더를 읽어 그 인코딩으로 변환하는 것
StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.Default);
Console.WriteLine(sr.ReadToEnd());
res.Close();
sr.Close();
}
}
-------------------------
HTTP 헤더 설정 및 읽기
-------------------------
HttpWebRequest 와 HttpWebResponse 클래스는 Headers 라는 속성을 가지고 있으며 이 속성은 HTTP 메시지의 헤더에 대한 정보를 담고 있는 WebHeaderCollection 객체를 돌려 줍니다. Add() 나 Set() 을 호출하여 HTTP 요청에 헤더를 추가 할 수도 있습니다.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(“ http://www.daum.net ”);
req.Headers.Add(“Accept-Language:en-us”);
//req.Headers.Set(“Accept-Language”, “en-us”);
HttpWebRequest 클래스는 Headers 속성을 이용하지 않고 요청헤더를 설정 하도록 많은 public 속성을 가지고 있습니다.
속성
|
데이터 형식
|
HTTP 헤더
|
Accept
|
string
|
Accept
|
Connection
|
string
|
Connection
|
ContentLenth
|
long
|
Cotent-Length
|
ContentType
|
string
|
Content-Type
|
Expect
|
string
|
Expect
|
IfModifedSince
|
DateTime
|
If-Modified-Since
|
Referer
|
string
|
Referer
|
TranferEncoding
|
string
|
Tranfer-Encoding
|
UserAgent
|
string
|
User-Agent
|
헤더를 설정 하기 위한 속성이 있다면 이 속성을 사용 하지 않고 헤더를 설정하려 하면 런 타임 예외가 발생 한다 .
req.Headers.Add(“User-Agent: SimpleHttpClient”);
HttpWebResponse 객체의 속성은 아래와 갑습니다.
속성
|
데이터 형식
|
HTTP 헤더
|
ContentEncoding
|
string
|
Content-Encoding
|
ContentLenth
|
long
|
Cotent-Length
|
ContentType
|
string
|
Content-Type
|
LastModified
|
DateTime
|
Last-Modified
|
Server
|
string
|
Server
|
각 헤더 항목들은 WebHeaderCollection 에서 이름 - 값 쌍으로 이용 할 수 있으며 헤더의 이름이 컬렉션의 키가 되므로 헤더의 이름을 컬렉션이 인덱스로 사용 하여 헤더의 값을 이용 가능 합니다.
foreach(string header in res.Headers) {
Console.WriteLine({0} : {1}”, headers, res.Headers[header]);
}
---------------------
데이터의 게시
---------------------
게시판등에 글을 올리는 경우엔 POST 방식을 주로 이용 한다 .
HttpWenRequest 와 HttpWebResponse 를 이용하여 실제 게시판에 글을 올리는 C# 프로그램을 만들어 보기로 핮ㅅ , 아래의 예제를 참고하세요...
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
class PostData {
static void Main () {
string URL = "http://localhost/oraclejava/multiboard/board/write_save.html";
StreamWriter sw = null;
string name = "jclee";
string email = "jclee@oraclejavanew.kr";
string title = " 열심히들 쓰고 있군요 ...";
string password = "1111";
string content = " 이건 내용 입니다 .";
string board_code = "freeboard";
string postData = "board_code=" + HttpUtility.UrlEncode(board_code) + "&" +
"name=" + HttpUtility.UrlEncode(name, Encoding.Default) + "&" +
"email=" + HttpUtility.UrlEncode(email) + "&" +
"title=" + HttpUtility.UrlEncode(title,Encoding.Default) + "&" +
"passwd1=" + HttpUtility.UrlEncode(password) + "&" +
"content=" + HttpUtility.UrlEncode(content,Encoding.Default);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
req.Method = "POST";
req.ContentLength = postData.Length;
req.ContentType = "application/x-www-form-urlencoded";
sw = new StreamWriter(req.GetRequestStream());
// 데이터를 인코딩
byte[] sendBuffer = Encoding.Default.GetBytes(postData);
// 데이터를 올리자 .
sw.Write(postData, 0, postData.Length );
//sw.Write(postData);
sw.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader srData = new StreamReader(res.GetResponseStream());
// 결과 스트림을 얻는다 .
string outHtml = srData.ReadToEnd();
Console.WriteLine(outHtml);
res.Close();
srData.Close();
}
}
---------------
HTTP Pipelining
---------------
HTTP 1.1 의 가장 중요한 기능 중의 하나가 바로 파이프 라이닝 입니다 . 이 기능을 통해 .NET 클래스들은 서버의 응답을 기다린 다음 요청을 전송하는 방식이 아니라 지속되는 연결을 사용하여 다수의 HTTP 요청을 백엔드 서버로 전송 할 수 있습니다 . 그러므로 파이브 라이닝이 가능하게 되면 서버에 여러 개의 리소스를 연결하는 애플리케이션은 시간이 오래 걸리는 리소스의 응답이 끝나기를 기다리는 위하여 대기하는 상태가 발생 하지 않죠 . 파이프라이닝은 기본적으로 활성화 되어 있지만 HttpWebRequest 의 Pipelines 속성을 false 로 하면 비 활성화 됩니다 .
----------------
HTTP 의 연결 유지
----------------
지속되는 연결 기능은 HTTP 1.0 에 소개된 기능으로 요청이 필요 할 때 마다 TCP 연결을 새로 생성하고 종료 하는 것이 아니라 서버에 기존의 TCP 연결을 유지 하면서 재사용이 가능 합니다 . Connection 헤더는 연결 유지 기능을 제어 하며 기본적으로 HTTP 1.1 에서는 연결은 모두 연결 유지 기능을 사용하는 것으로 간주 합니다 . 그러나 Connection:close 헤더를 사용 하면 연결을 종료 하며 기본적으로 HttpWebRequest 객체의 KeepAlive 속성을 true 로 설정하면 서버와 맺어진 연결을 계속 유지하며 서버는 연결유지 기능을 지원해야 합니다.
댓글 없음:
댓글 쓰기