1. 개방 분석
우선, 모든 사람은 "HTTP"라는 개념에 익숙해야합니다. 특정 언어를 기반으로하는 것이 아니라 일반적인 응용 프로그램 계층 프로토콜입니다. 언어마다 구현 세부 사항이 다르지만 원칙과 일치하며 아이디어는 동일합니다.
호스트 실행 환경으로서 Nodejs는 JavaScript를 호스트 언어로 사용하며 자체 표준 세트가 구현되어 있습니다. 이 기사에서는 "HTTP 모듈"에 대해 함께 알아 보겠습니다. 그러나 전제로서
공식 웹 사이트에서 제공 한 API를 먼저 읽고 예비 이해를 가질 수 있기를 바랍니다. 다음은 HTTP 부분의 API에 대한 개요입니다.
코드 사본은 다음과 같습니다.
http
http.status_codes
http.createserver ([requestListener])
http.createclient ([port], [host])
클래스 : http.server
이벤트 : '요청'
이벤트 : '연결'
이벤트 : '닫기'
이벤트 : 'CheckContinue'
이벤트 : '연결'
이벤트 : '업그레이드'
이벤트 : 'ClientError'
server.listen (포트, [호스트 이름], [백 로그], [콜백])
Server.Listen (Path, [Callback])
Server.Listen (핸들, [콜백])
Server.Close ([Callback])
Server.MaxHeadersCount
Server.SetTimeout (MSECS, 콜백)
Server.Timeout
클래스 : http.serverresponse
이벤트 : '닫기'
response.writeContinue ()
response.writehead (StatusCode, [rasyPhrase], [헤더])
Response.setTimeout (MSECS, 콜백)
응답 .Statuscode
응답 .Setheader (이름, 가치)
응답
응답 .senddate
응답. 제목 (이름)
Response.removeHeader (이름)
response.write (청크, [인코딩])
응답. AddTrailers (헤더)
response.end ([data], [인코딩])
http.request (옵션, 콜백)
http.get (옵션, 콜백)
클래스 : http.agent
새로운 에이전트 ([옵션])
에이전트 .maxsockets
에이전트 .maxfreesockets
에이전트
Agent.freesockets
에이전트
Agent.destroy ()
Agent.getName (옵션)
http.globalagent
클래스 : http.clientrequest
이벤트 '응답'
이벤트 : '소켓'
이벤트 : '연결'
이벤트 : '업그레이드'
이벤트 : '계속'
request.write (청크, [인코딩])
request.end ([data], [인코딩])
request.abort ()
request.settimeout (timeout, [콜백])
request.setnodelay ([Nodelay])
request.setSocketKeepalive ([enable], [EitialDelay])
http.incomingmessage
이벤트 : '닫기'
message.httpversion
Message.Headers
메시지. Rawheaders
메시지. 트레일러
메시지. Rawtrailers
message.settimeout (msecs, 콜백)
message.method
message.url
Message.Statuscode
Message.Socket
간단한 예로 시작하고 Server.js라는 파일을 만들고 다음 코드를 작성하겠습니다.
코드 사본은 다음과 같습니다.
var http = 요구 ( 'http');
var server = http.createserver (function (req, res) {
res.writeHeader (200, {
'content-type': 'text/plain; charset = utf-8'// charset = utf-8을 추가합니다
});
res.end ( "안녕하세요, 큰 곰!");
});
Server.Listen (8888);
Console.log ( "포트 8888에서 실행되는 HTTP 서버 ...");
(Node Server.js) 다음은 실행 중입니다.
2. 자세한 분석 예
이 작은 예를 살펴 보겠습니다.
(라인 1) : "요구 사항"을 통해 Nodejs와 함께 제공되는 "HTTP"모듈을 소개하고 HTTP 변수에 할당하십시오.
(2 행) : HTTP 모듈에서 제공 한 함수를 호출하십시오 : "CreateServer". 이 기능은 새 웹 서버 객체를 반환합니다.
"requestListener"매개 변수는 "요청"이벤트의 청취 대기열에 자동으로 추가되는 함수입니다.
요청이 도착하면 이벤트 루프는 리스너 콜백 함수를 실행 큐에 넣고 노드의 모든 코드가 실행 큐에서 하나씩 실행됩니다.
이러한 실행은 모두 작업자 스레드에 있습니다 (이벤트 루프 자체는 독립 스레드에있는 것으로 간주 될 수 있습니다. 우리는 일반적 으로이 스레드를 언급하지 않지만 노드를 단일 스레드 실행 환경으로 호출합니다).
모든 콜백은 작업자 스레드에서 실행됩니다.
두 가지 매개 변수 (요청, 응답)를 제공하는 콜백 함수 "requestListener"를 살펴 보겠습니다.
요청이 접수 될 때마다 트리거됩니다. 각 연결에는 여러 요청이있을 수 있습니다 (계속 연결 상태에서).
"요청"은 http.incomingMessage의 인스턴스입니다. "응답"은 http.serverresponse의 인스턴스입니다.
HTTP 요청 객체는 읽기 쉬운 스트림이고 HTTP 응답 객체는 쓰기 가능한 스트림입니다.
"IncomingMessage"객체는 http.server 또는 http.clientrequest에 의해 생성됩니다.
첫 번째 매개 변수로 각각 "요청"및 "응답"이벤트로 전달됩니다.
또한 상태, 헤더 파일 및 응답 데이터에 액세스하는 데 사용될 수도 있습니다.
"스트림"인터페이스와 다음의 추가 이벤트, 메소드 및 속성을 구현합니다. (자세한 내용은 API를 참조하십시오).
(3 lines) : "WriteHeader", "response.writehead ()"함수를 사용하여 HTTP 상태 200 및 HTTP 헤더 (Content-Type)의 컨텐츠 유형을 보냅니다.
요청 헤더에 응답하십시오. "StatusCode"는 404와 같은 3 비트 HTTP 상태 코드입니다. 마지막 매개 변수 "헤더"는 응답 헤더의 내용입니다.
밤나무를 가져 가십시오 :
코드 사본은 다음과 같습니다.
var body = 'Hello World';
response.writehead (200, {
'콘텐츠 길이': body.length,
'콘텐츠 유형': 'Text/Plain'
});
참고 : 내용 길이는 문자가 아닌 바이트로 계산됩니다.
이전 예제의 이유는 문자열 "Hello World!"입니다. 단일 바이트 문자 만 포함합니다.
본문에 멀티 바이트 인코딩 된 문자가 포함 된 경우 Buffer.Bytelength ()를 사용하여 멀티 바이트 문자 인코딩의 경우 문자열의 바이트 수를 결정해야합니다.
Node는 내용 형 제한 속성이 전송 된 신체 길이와 일치하는지 여부를 확인하지 않음을 추가로 설명해야합니다.
상태 코드는 "404"와 같은 3 비트 HTTP 상태 코드입니다. 내가 여기서 이야기하고 싶은 것은 "http.status_codes", 표준 "http"응답 상태 코드의 모든 세트와 짧은 설명이 포함되어 있습니다.
다음은 소스 코드 참조입니다.
코드 사본은 다음과 같습니다.
var status_codes = Exports.status_codes = {
100 : '계속',
101 : '스위칭 프로토콜',
102 : 'Processing', // rfc 2518, RFC 4918에 의해 쓸모없는
200 : 'Ok',
201 : '생성',
202 : '허용',
203 : '비 승인 정보',
204 : '콘텐츠 없음',
205 : '콘텐츠 재설정',
206 : '부분 내용',
207 : '멀티 스테이터', // rfc 4918
300 : '다중 선택',
301 : '영구적으로 움직였다',
302 : '일시적으로 움직였다',
303 : '기타보기',
304 : '수정되지 않음',
305 : '프록시 사용',
307 : '임시 리디렉션',
400 : '나쁜 요청',
401 : '무단',
402 : '지불 필요',
403 : '금지',
404 : '찾지 못함',
405 : '방법이 허용되지 않는다',
406 : '허용되지 않음',
407 : '프록시 인증 필요',
408 : 'Time-Out 요청',
409 : '갈등',
410 : 'Gone',
411 : '길이가 필요하다',
412 : '전제 조건 실패',
413 : '엔티티가 너무 큰 요청',
414 : '요청-우리 너무 큰',
415 : '지원되지 않은 미디어 유형',
416 : '요청 된 범위는 만족스럽지 않다',
417 : '기대치 실패',
418 : 'I/'Ma Teapot ', // rfc 2324
422 : '처리 할 수없는 엔티티', // rfc 4918
423 : '잠금', // rfc 4918
424 : '실패 의존성', // rfc 4918
425 : '정렬되지 않은 컬렉션', // rfc 4918
426 : '업그레이드 필요', // rfc 2817
500 : '내부 서버 오류',
501 : '구현되지 않음',
502 : '나쁜 게이트웨이',
503 : '서비스를 사용할 수 없음',
504 : '게이트웨이 타임 아웃',
505 : 'HTTP 버전이 지원되지 않음',
506 : '변형 협상', // rfc 2295
507 : '불충분 한 저장소', // rfc 4918
509 : '대역폭 한계 초과',
510 : '확장되지 않음'// rfc 2774
};
Nodejs 소스 코드에서 발췌 한 "http.js"는 143 행으로 시작합니다.
실제로 클라이언트 응답 결과에서보기는 어렵지 않습니다.
(6 lines) : "response.end"------ 모든 응답 헤더 및 메시지가 전송되면이 메소드는 신호를 서버로 보냅니다. 서버는 메시지가 완료되었다고 생각합니다.
이 방법은 각 응답이 완료된 후에 호출되어야합니다. 매개 변수 "data"가 지정된 경우 "response.write (data, alcoding)" "그리고"response.end () "을 호출하는 것과 같습니다.
(8 line) : "server.listen (8888)"----- 서버는 지정된 핸들과의 연결을 수락하고 특정 포트에 바인딩합니다.
위의 내용은 이해를 심화시키는 데 도움이되는보다 자세한 분석 프로세스입니다. 코드는 많지 않지만 NodeJS 응용 프로그램이 향후 효율적으로 개발 될 수 있도록 일부 상세 메커니즘을 이해하는 데 중점을 둡니다.
세 가지, 예
"요청"객체를 사용하여 요청 헤더 데이터에 액세스하는 것 외에도 "요청"객체를 읽기 전용 데이터 스트림으로 사용하여 요청 본문 데이터에 액세스 할 수 있습니다.
다음은 "게시"요청의 예입니다.
코드 사본은 다음과 같습니다.
http.createserver (함수 (요청, 응답) {
var body = [];
Console.log (request.method);
Console.log (request.headers);
request.on ( 'data', function (chunk) {
body.push (청크);
});
request.on ( 'end', function () {
body = buffer.concat (body);
console.log (body.tostring ());
});
}). 듣기 (8888);
아래는 전체 "HTTP"요청 데이터 컨텐츠입니다.
코드 사본은 다음과 같습니다.
포스트/http/1.1
사용자 에이전트 : CURL/7.26.0
호스트 : LocalHost
수용하다: */*
내용 길이 : 11
컨텐츠 유형 : 응용 프로그램/x-www-form-urlencoded
안녕하세요 세계
4, 요약합시다
(1) "HTTP"의 개념을 이해하십시오.
(2) "HTTP"관련 API를 사용하는 데 능숙합니다.
(3) "Post, Get"간의 처리 세부 사항과 같은 세부 사항의 제어에주의를 기울입니다.
(4), "requestListener"에 대한 이해.
(5), 개념을 강조하십시오 : HTTP 요청 객체는 읽을 수있는 스트림이고 HTTP 응답 객체는 쓰기 가능한 스트림입니다.