이동 웹 프로그래밍 - 라우팅 및 HTTP 서비스

이 문서에서는 라우팅 및 서비스 이동 HTTP 웹 프로그래밍 언어의 기본 원리를 설명합니다.

첫째, 서비스 HTTP를 시작하는 가장 쉬운 언어를 이동 :

기본 패키지 

가져 오기 ( 
	"로그" 
	""그물 / HTTP 
) 

{) (주 FUNC 
	(/ "sayHello가) http.HandleFunc는" 
	log.Println ( "서버가 ... 실행") 
	log.Fatal을 (http.ListenAndServe ( "로컬 호스트 : 4000 ", 전무)) 
} 

의 sayHello (작가 http.ResponseWriter FUNC, REQ * http.Request) { 
	! writer.Write ([] 바이트 ("안녕하세요 세계 ")) 
}

컴파일 및 액세스에서 http 브라우저를 실행 : // localhost를 : 4000 / 출력 안녕하세요 세계!
전반적으로,이 코드는 단지 첫째, 등록 라우팅, 클라이언트 요청에 응답 함수의 경로 지정, 두 가지를 할 :
http.HandleFunc를 ( "/"sayHello가)
둘째, 수신 포트, HTTP 서비스를 시작합니다 수신 클라이언트 요청에 응답 :
http.ListenAndServe를 ( "로컬 호스트 : 4000", 전무)

 

제일 먼저 봐 - 요청 응답 기능에 해당하는 등록 된 경로 지정된 경로를.
먼저 살펴 http.HandleFunc () 함수 출처 :

FUNC HandleFunc (패턴 문자열 핸들러 FUNC (ResponseWriter * 요청)) { 
	DefaultServeMux.HandleFunc (패턴 핸들러) 
}

그래서 실제로 라우터에 의해 등록 된 라우팅 기본 라우터의 이동이다 DefaultServeMux, http.HandleFunc () 함수는 간단히 라우터의 구조는 어떻게의 종류, 그것을 캡슐화?
출처 표시 :

ServeMux 구조체 입력 { 
	MU sync.RWMutex의 
	m 맵 [문자열] muxEntry는 
	말이지 [] muxEntry의 
	호스트에서 bool 
} 
muxEntry 구조체 {입력 
	H 처리기 
	패턴 문자열 
}

상기 ServeMux 구조 맵 [캐릭터] muxEntry 요청이 경로 응답 기능 간의 매핑을 저장하는 데 사용된다. 다음과 같이 정의 된 구조에서 본 MuxEntry은 핸들러의 응답 함수의 타입 핸들러 실제로 인터페이스 타입, 소스 코드 :

입력 인터페이스 핸들러 { 
	ServeHTTP (ResponseWriter, 요청 *) 
}

所以,响应函数需要实现这个接口,才能进行路由注册。
源码中声明了一个 HandlerFunc 类型,就实现了 Handler 接口:

type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

所以,只要我们的响应函数满足结构 func (http.ResponseWriter, *http.Request) ,即可进行路由注册,注册路由时,路由器会将其类型强制转换为 HandlerFunc 。其中,http.ResponseWriter参数包含了响应头、响应数据等响应相关信息,而http.Request参数则包含了请求头、请求参数等请求相关信息。

 

再看第二件事情,启动http服务,监听端口,接受并响应客户端请求。
首先看 http.ListenAndServe() 函数源码:

func ListenAndServe(addr string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServe()
}

其中 Server 即为http服务器类型,其结构如下(省略了部分字段):

type Server struct {
	Addr    string
	Handler Handler
......
}

其中 Addr 为服务器监听的ip与端口字符串,Handler 为路由器,指定其为 nil 时,go会使用它的默认路由器 DefaultServeMux (调用 http.HandleFunc() 方法注册路由时就是注册到这个默认的路由器)。
服务器监听端口,接受客户端请求,并做出响应,这个过程可借助《go web编程》中的一张图示来帮助理解:

图中有两个红色矩形标记,第一个,说明针对客户端的每一个请求,go都会使用一个Goroutine进行响应,保证每个请求都能独立,相互不会阻塞,可以高效响应网络事件;第二,最终调用默认路由器的 ServeHTTP(w ResponseWriter, r *Request) 方法进行路由,从请求路径与响应函数的映射中找到对应的handler,最后调用handler的 ServeHTTP(w ResponseWriter, r *Request) 方法,从上面 HandlerFunc 类型的 ServeHTTP(w ResponseWriter, r *Request) 方法可知,其实最后调用的就是我们注册路由时定义的响应函数本身。

使用go默认路由器的不足之处是,不满足RESTful规则,而且对请求路径的路由只支持绝对匹配,不支持正则匹配。如果想设计一些特殊、简便的路由,需要设计一个自定义路由器,并让go的http服务器使用这个自定义路由器。关于自定义路由器的设计,可以参考笔者另一篇博文:

 

 

借鉴:
《Go Web编程》

 

추천

출처www.cnblogs.com/wujuntian/p/11858632.html