广东贸易网站建设,郑州专业高校网站建设公司,济南seo关键词排名工具,外贸网站 流量Go语言网络库net/http
Http 协议(Hyper Text Transfer Protocol#xff0c;超文本传输协议)是一个简单的请求-响应协议#xff0c;它通常运行在 TCP 之
上。超文本传输协议是互联网上应用最为广泛的一种网络传输协议#xff0c;所有的WWW文件都必须遵守这个标准。
Http 协…Go语言网络库net/http
Http 协议(Hyper Text Transfer Protocol超文本传输协议)是一个简单的请求-响应协议它通常运行在 TCP 之
上。超文本传输协议是互联网上应用最为广泛的一种网络传输协议所有的WWW文件都必须遵守这个标准。
Http 协议是基于客户端 Cilent /服务器 Server 模式且面向连接的。简单的来说就是客户端 Cilent 向服务器
Server 发送 http 请求 Request服务器 Server 接收到 http 服务请求 Request 后会在 http 响应Response 中回
送所请求的数据。
Go语言内置的 net/http 包十分的优秀提供了HTTP客户端和服务端的实现。
官网地址https://pkg.go.dev/net/http
1、HTTP客户端
通过 Get、Head、Post 和 PostForm 函数发出 HTTP/HTTPS 请求。
resp, err : http.Get(http://example.com/)resp, err : http.Post(http://example.com/upload, image/jpeg, buf)resp, err : http.PostForm(http://example.com/form,url.Values{key: {Value}, id: {123}})1.1 发送Get请求
不带请求参数
package mainimport (fmtio/ioutilnet/http
)func main() {resp, err : http.Get(http://www.baidu.com)if err ! nil {fmt.Printf(get failed, err:%v\n, err)return}// 程序在使用完response后必须关闭回复的主体defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Printf(read from resp.Body failed, err:%v\n, err)return}fmt.Print(string(body))
}带参数参数需要使用到 net/url 来处理。
package mainimport (fmtio/ioutilnet/httpnet/url
)func main() {apiUrl : http://127.0.0.1:9090/get// URL paramdata : url.Values{}data.Set(name, mi)data.Set(age, 18)u, err : url.ParseRequestURI(apiUrl)if err ! nil {fmt.Printf(parse url requestUrl failed, err:%v\n, err)}// URL encodeu.RawQuery data.Encode()// http://127.0.0.1:9090/get?age18namemifmt.Println(u.String())resp, err : http.Get(u.String())if err ! nil {fmt.Printf(post failed, err:%v\n, err)return}defer resp.Body.Close()b, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Printf(get resp failed, err:%v\n, err)return}// {status: ok}fmt.Println(string(b))
}对应 server 端的处理
package mainimport (fmtnet/http
)func getHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()data : r.URL.Query()// mifmt.Println(data.Get(name))// 18fmt.Println(data.Get(age))answer : {status: ok}w.Write([]byte(answer))
}func main() {http.HandleFunc(/get, getHandler)err : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(http server failed, err:%v\n, err)return}
}带 header 头部信息
package mainimport (fmtnet/httpnet/http/httputil
)func main() {url : http://127.0.0.1:9090/getrequest, err : http.NewRequest(http.MethodGet, url, nil)if err ! nil {panic(err)}request.Header.Add(Authorization, jhs8723sd2dshd2)request.Header.Add(User-Agent, User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1)resp, err : http.DefaultClient.Do(request)if err ! nil {panic(err)}defer resp.Body.Close()// //获取网页内容s, err : httputil.DumpResponse(resp, true)if err ! nil {panic(err)}fmt.Printf(%s, s)
}1.2 发送POST请求
package mainimport (fmtio/ioutilnet/httpstrings
)func main() {url : http://127.0.0.1:9090/post// 表单数据// contentType : application/x-www-form-urlencoded// data : namemiage18// jsoncontentType : application/jsondata : {name:mi,age:18}resp, err : http.Post(url, contentType, strings.NewReader(data))if err ! nil {fmt.Printf(post failed, err:%v\n, err)return}defer resp.Body.Close()b, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Printf(get resp failed, err:%v\n, err)return}// {status: ok}fmt.Println(string(b))
}对应 server 端
package mainimport (fmtio/ioutilnet/http
)func postHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()// 1. 请求类型是application/x-www-form-urlencoded时解析form数据r.ParseForm()// 打印form数据// map[]fmt.Println(r.PostForm)fmt.Println(r.PostForm.Get(name), r.PostForm.Get(age))// 2. 请求类型是application/json时从r.Body读取数据b, err : ioutil.ReadAll(r.Body)if err ! nil {fmt.Printf(read request.Body failed, err:%v\n, err)return}// {name:mi,age:18}fmt.Println(string(b))answer : {status: ok}w.Write([]byte(answer))
}func main() {http.HandleFunc(/post, postHandler)err : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(http server failed, err:%v\n, err)return}
}1.3 PostForm方式
package mainimport (fmtio/ioutilnet/httpnet/url
)func main() {resp, err : http.PostForm(http://127.0.0.1:9090/post,url.Values{key: {Value}, id: {123}})if err ! nil {fmt.Println(err)}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Println(err)}fmt.Println(string(body))
}json
package mainimport (bytesencoding/jsonfmtio/ioutilnet/http
)func main() {data : make(map[string]interface{})data[site] www.baidu.comdata[name] tombytesData, _ : json.Marshal(data)resp, _ : http.Post(http://httpbin.org/post, application/json, bytes.NewReader(bytesData))body, _ : ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}带有 headers 参数
package mainimport (fmtio/ioutilnet/httpstrings
)func main() {client : http.Client{}req, err : http.NewRequest(POST, http://www.01happy.com/demo/accept.php, strings.NewReader(namecjb))if err ! nil {fmt.Println(err)}req.Header.Set(Content-Type, application/x-www-form-urlencoded)req.Header.Set(Cookie, nameanny)resp, err : client.Do(req)defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {fmt.Println(err)}fmt.Println(string(body))
}1.4 自定义Client
要管理 HTTP 客户端的头域、重定向策略和其他设置创建一个 Client
package mainimport (fmtnet/httpnet/http/httputil
)func main() {request, err : http.NewRequest(http.MethodGet, http://www.baidu.com, nil)if err ! nil {panic(err)}client : http.Client{CheckRedirect: func(req *http.Request, via []*http.Request) error {fmt.Println(Redirect:, req)return nil},}request.Header.Add(User-Agent, User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1)resp, err : client.Do(request)if err ! nil {panic(err)}defer resp.Body.Close()s, err : httputil.DumpResponse(resp, true)fmt.Printf(%s, s)
}1.5 自定义Transport
要管理代理、TLS 配置、keep-alive、压缩和其他设置创建一个Transport
package mainimport (crypto/tlscrypto/x509fmtio/ioutilnet/http
)// 使用匹配的证书方法
func main() {// *.pem文件的内容rootCA : roots : x509.NewCertPool()ok : roots.AppendCertsFromPEM([]byte(rootCA))if !ok {panic(failed to parse root certificate)}client : http.Client{Transport: http.Transport{TLSClientConfig: tls.Config{RootCAs: roots},DisableCompression: true,},}resp, err : client.Get(http://baidu.com)if err ! nil {panic(err)}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)if err ! nil {panic(err)}if err ! nil {fmt.Printf(read from resp.Body failed, err:%v\n, err)return}fmt.Print(string(body))
}Client 和 Transport 类型都可以安全的被多个 goroutine 同时使用。出于效率考虑应该一次建立、尽量重用。
package mainimport (crypto/tlsfmtio/ioutilnet/http
)// 跳过安全检查
func main() {tr : http.Transport{TLSClientConfig: tls.Config{InsecureSkipVerify: true},}client : http.Client{Transport: tr}resp, err : client.Get(https://localhost:8081)if err ! nil {fmt.Println(error:, err)return}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}2、服务端
2.1 默认的Server
ListenAndServe 使用指定的监听地址和处理器启动一个 HTTP 服务端处理器参数通常是 nil这表示采用包变量
DefaultServeMux 作为处理器。
Handle 和 HandleFunc 函数可以向 DefaultServeMux 添加处理器。
package mainimport (lognet/http
)type httpServer struct {
}func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {w.Write([]byte(r.URL.Path))
}func main() {var server httpServerhttp.Handle(/foo, server)http.HandleFunc(/bar, func(w http.ResponseWriter, r *http.Request) {w.Write([]byte(r.URL.Path))})log.Fatal(http.ListenAndServe(:9090, nil))
}事件处理器的 Handler 接口定义如下
type Handler interface {ServeHTTP(ResponseWriter, *Request)
}只要实现了这个接口就可以实现自己的 handler 处理器。
如果 ListenAndServe() 传入的第一个参数地址为空则服务器在启动后默认使用 http://127.0.0.1:8080 地址
进行访问。
如果这个函数传入的第二个参数为 nil则服务器在启动后将使用默认的多路复用器DefaultServeMux。
2.2 默认的Server示例
使用 Go 语言中的 net/http 包来编写一个简单的接收 HTTP 请求的 Server 端示例net/http 包是对 net 包的
进一步封装专门用来处理 HTTP 协议的数据。具体的代码如下
package mainimport (fmtnet/http
)func sayHello(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, Hello shanghai)
}func main() {http.HandleFunc(/, sayHello)err : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(http server failed, err:%v\n, err)return}
}将上面的代码编译之后执行打开你电脑上的浏览器在地址栏输入127.0.0.1:9090回车
# 输出
Hello shanghaipackage mainimport (encoding/json_ encoding/jsonfmtio/ioutilnet/httpnet/urlstrings
)var (api http://127.0.0.1:9090/token 9adf92861
)type Result struct {Code int json:codeMsg string json:msg
}type Resp struct {Code string json:codeMsg string json:msg
}func wechatUrlHandle(w http.ResponseWriter, r *http.Request) {// 获取链接地址var wechatUrl stringvalues : r.URL.Query()wechatUrl values.Get(url)// 验证URL的正确性targetUrl, err : url.ParseRequestURI(wechatUrl)if err ! nil {fmt.Printf(parse url failed, err:%v\n, err)}fmt.Printf(fmt.Sprintf(url: %v, targetUrl))// 拼接参数发起请求data : fmt.Sprintf(token%surl%s, token, targetUrl.String())headers : application/x-www-form-urlencodedres, err : http.Post(api, headers, strings.NewReader(data))if err ! nil {fmt.Printf(post failed, err: %v\n, err)return}// 关闭请求资源defer res.Body.Close()body, err : ioutil.ReadAll(res.Body)if err ! nil {fmt.Fprintf(w, fmt.Sprintf(get resp failed. err: %v\n, err))return}var info Resultvar ress Respw.Header().Set(Content-Type, application/json)if err : json.Unmarshal(body, info); err nil {fmt.Println(info.Code, info.Msg)ress.Code 200ress.Msg Successt, _ : json.Marshal(ress)w.Write(t)} else {ress.Code 200ress.Msg failuret, _ : json.Marshal(ress)fmt.Println(err: , err)w.Write(t)}
}func main() {http.HandleFunc(/wechat/url, wechatUrlHandle)// 处理器参数一般为nilerr : http.ListenAndServe(:9090, nil)if err ! nil {fmt.Printf(Http server failed. err: %v\n, err)return}}2.3 自定义Server
要管理服务端的行为可以创建一个自定义的 Server。
用户可以通过 Server 结构体对服务器进行更详细的配置包括设置地址为请求读取操作设置超过时间等等。
package mainimport (lognet/httptime
)type httpServer struct {
}func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {w.Write([]byte(r.URL.Path))
}func main() {s : http.Server{Addr: :9090,Handler: httpServer{},ReadTimeout: 10 * time.Second,WriteTimeout: 10 * time.Second,MaxHeaderBytes: 1 20,}log.Fatal(s.ListenAndServe())
}2.4 多路复用器
多路复用器的基本原理根据请求的 URL 地址找到对应的处理器调用处理器对应的 ServeHTTP() 方法处理请
求。
DefaultServeMux 是 net/http 包的默认多路复用器其实就是 ServeMux 的一个实例。
HandleFunc() 函数用于为指定的 URL 注册一个处理器HandleFunc() 处理器函数会在内部调用
DefaultServeMux 对象对应的 HandleFunc 方法。
2.4.1 ServeMux与DefaultServeMux
我们可以使用默认多路复用器注册多个处理器达到与处理器一样的作用。
下面演示如何通过默认多路复用器创建自己的服务器。
package mainimport (fmtnet/http
)//定义多个处理器
type handle1 struct{}func (h1 *handle1) ServeHTTP(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, handle one)
}type handle2 struct{}func (h2 *handle2) ServeHTTP(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, handle two)
}func main() {handle1 : handle1{}handle2 : handle2{}// Handler:nil表明服务器使用默认的多路复用器DefaultServeMuxs : http.Server{Addr: 127.0.0.1:8080,Handler: nil,}// Handle函数调用的是多路复用器DefaultServeMux.Handle方法http.Handle(/handle1, handle1)http.Handle(/handle2, handle2)s.ListenAndServe()
}我们通过使用自己的 handle1 和 handle2 来指定两个处理器http.Handle() 函数可以调用
DefaultServeMux.Handle() 方法来处理请求。
Handle: nil 对应的是处理器是DefaultServeMux。
在ServeMux对象的ServeHTTP()方法中根据URL查找我们注册的服务器然后请求交给它处理。
虽然默认的多路复用器很好用但仍然不推荐使用因为它是一个全局变量所有的代码都可以修改它。有些第三
方库中可能与默认复用器产生冲突。所以推荐的做法是自定义。
2.4.2 自定义多路复用器
package mainimport (fmtnet/http
)func newservemux(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, NewServeMux)
}func main() {mux : http.NewServeMux()mux.HandleFunc(/, newservemux)s : http.Server{Addr: :8081,Handler: mux,}s.ListenAndServe()
}NewServeMux 实质上还是 ServeMux。
2.4.3 ServeMux的路由匹配
我们现在需要绑定三个URL分别为//happy/bad。
package mainimport (fmtnet/http
)func newservemux(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, NewServeMux)
}func newservemuxhappy(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, Newservemuxhappy)
}func newservemuxbad(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, NewServeMuxbad)
}
func main() {mux : http.NewServeMux()mux.HandleFunc(/, newservemux)mux.HandleFunc(/happy, newservemuxhappy)mux.HandleFunc(/bad, newservemuxbad)s : http.Server{Addr: :8080,Handler: mux,}s.ListenAndServe()
}2.5 HttpRouter
ServeMux 的一个缺陷是无法使用变量实现 URL 模式匹配而 HttpRouter 可以HttpRouter 是一个高性能的第
三方 HTTP 路由包弥补了 net/http 包中的路由不足问题。
$ go get github.com/julienschmidt/httprouterhttprouter 的使用首先得使用 New() 函数生成一个 *Router 路由对象然后使用 GET()方法去注册匹配的函
数最后再将这个参数传入 http.ListenAndServe 函数就可以监听服务。
package mainimport (net/httpgithub.com/julienschmidt/httprouter
)func Hello(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {w.Write([]byte(Hello,httprouter!))
}func main() {router : httprouter.New()router.GET(/, Hello)http.ListenAndServe(:8080, router)
}更为重要的是它为 URL 提供了两种匹配模式
/user/:pac精准匹配 /user/pac/user/*pac匹配所有模式 /user/hello
Pattern: /user/:user/user/gordon match/user/you match/user/gordon/profile no match/user/ no matchPattern: /src/*filepath/src/ match/src/somefile.go match/src/subdir/somefile.go matchpackage mainimport (fmtlognet/httpgithub.com/julienschmidt/httprouter
)func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {fmt.Fprint(w, Welcome!\n)
}func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {fmt.Fprintf(w, hello, %s!\n, ps.ByName(name))
}func main() {router : httprouter.New()router.GET(/, Index)router.GET(/hello/:name, Hello)log.Fatal(http.ListenAndServe(:8080, router))
}当然这里还有 POST()DELETE() 函数的详情就不一一介绍了。
3、其它应用
3.1 DNS
package mainimport (fmtlognet
)func main() {// 根据域名返回ip地址addr, err : net.ResolveIPAddr(ip, devops.miliantech.com)if err ! nil {return}// 2023/07/24 20:45:43 devops.miliantech.com 对应地址ip地址---- 172.21.6.96log.Println(devops.miliantech.com 对应地址ip地址----, addr)// 查找DNS A记录iprecords, _ : net.LookupIP(devops.miliantech.com)for _, ip : range iprecords {// LookupIP ----- 172.21.6.96fmt.Println(LookupIP -----, ip)}//查找DNS CNAME记录canme, _ : net.LookupCNAME(devops.miliantech.com)// LookupCNAME ----- devops.miliantech.com.fmt.Println(LookupCNAME -----, canme)//查找DNS PTR记录ptr, e : net.LookupAddr(172.21.6.96)if e ! nil {// lookup 172.21.6.96: dnsquery: DNS name does not exist.fmt.Println(e)} else {fmt.Println(ptr)}for _, ptrval : range ptr {fmt.Println(ptrval)}//查找DNS NS记录 名字服务器记录nameserver, _ : net.LookupNS(baidu.com)for _, ns : range nameserver {/*ns记录 {ns3.baidu.com.}ns记录 {ns2.baidu.com.}ns记录 {ns7.baidu.com.}ns记录 {ns4.baidu.com.}ns记录 {dns.baidu.com.}*/fmt.Println(ns记录, ns)}//查找DNS MX记录 邮件服务器记录mxrecods, _ : net.LookupMX(google.com)for _, mx : range mxrecods {fmt.Println(mx:, mx)}//查找DNS TXT记录 域名对应的文本信息txtrecords, _ : net.LookupTXT(baidu.com)for _, txt : range txtrecords {/*txt: _globalsign-domain-verificationqjb28W2jJSrWj04NHpB0CvgK9tle5JkOq-EcyWBgnEtxt: google-site-verificationGHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwMtxt: vspf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com mx ptr -all*/fmt.Println(txt:, txt)}//查看本地IP地址addrs, err : net.InterfaceAddrs()if err ! nil {return}for _, address : range addrs {// 检查ip地址判断是否回环地址if ipnet, ok : address.(*net.IPNet); ok !ipnet.IP.IsLoopback() {if ipnet.IP.To4() ! nil {/*本地地址 -- 169.254.124.27本地地址 -- 169.254.27.66本地地址 -- 169.254.158.118本地地址 -- 192.168.223.1本地地址 -- 192.168.132.1本地地址 -- 192.168.226.185*/fmt.Println(本地地址 -- , ipnet.IP.String())}}}
}3.2 简单的tcp请求实现
3.2.1 服务端
package mainimport (bufioiolognet
)func pes(conn net.Conn) {defer conn.Close()read : bufio.NewReader(conn)for {var p [512]byten, err : read.Read(p[:])if err ! nil {if err io.EOF {log.Println(客户端关闭链接, conn.RemoteAddr().String())return}log.Println(读取失败, err.Error())return}log.Println(客户端发送消息为, string(p[:n]))conn.Write([]byte(ok))}
}func main() {lis, err : net.Listen(tcp, 127.0.0.1:20003)if err ! nil {log.Println(listen ,err , err.Error())return}for {conn, err : lis.Accept()if err ! nil {log.Println(建立链接异常, err.Error())}go pes(conn)}
}3.2.2 客户端
package mainimport (bufioiolognetosstrings
)func main() {conn, err : net.Dial(tcp, 127.0.0.1:20003)if err ! nil {log.Println(conn err, err.Error())return}defer conn.Close()inputreader : bufio.NewReader(os.Stdin)for {input, _ : inputreader.ReadString(\n)input strings.Trim(input, \r\n)if input q || input Q {log.Println(退出链接)return}conn.Write([]byte(input))var p [512]byten, err : conn.Read(p[:])if err ! nil {if err io.EOF {log.Println(服务端关闭链接, conn.RemoteAddr().String())return}log.Println(读取失败, err.Error())return}log.Println(服务端发送消息为, string(p[:n]))}}3.3 粘包问题
一次只能读取固定长度的数据解决方案
package mainimport (bufiobytesencoding/binaryfmt
)func Encode(massge string) ([]byte, error) {len_for_msaaget : int32(len(massge))pkg : new(bytes.Buffer)err : binary.Write(pkg, binary.LittleEndian, len_for_msaaget)if err ! nil {return nil, err}err binary.Write(pkg, binary.LittleEndian, []byte(massge))if err ! nil {return nil, err}return pkg.Bytes(), nil
}func Decode(reader *bufio.Reader) (string, error) {peek, err : reader.Peek(4)if err ! nil {return , err}lengthBuff : bytes.NewBuffer(peek)var length int32err binary.Read(lengthBuff, binary.LittleEndian, length)if err ! nil {return , err}if int32(reader.Buffered()) 4length {return , fmt.Errorf(err)}p : make([]byte, int(4length))_, err reader.Read(p)if err ! nil {return , err}return string(p[4:]), nil
}3.4 简单的udp请求实现
3.4.1 服务端
package mainimport (lognet
)func main() {udp, err : net.ListenUDP(udp, net.UDPAddr{IP: net.IPv4(0, 0, 0, 0),Port: 30000,})if err ! nil {return}defer udp.Close()for {var p [1024]byten, addr, err : udp.ReadFromUDP(p[:])if err ! nil {log.Println(udp 请求处理异常 , err.Error())return}log.Println(请求信息, string(p[:n]), addr.String())_, err udp.WriteToUDP([]byte(get), addr)if err ! nil {log.Println(返回信息失败, err.Error())return}}
}3.4.2 客户端
package mainimport (lognet
)func main() {udp, err : net.DialUDP(udp, nil, net.UDPAddr{IP: net.IPv4(0, 0, 0, 0),Port: 30000,})if err ! nil {log.Println(err.Error())return}defer udp.Close()_, err udp.Write([]byte(我是服务端 hello server))if err ! nil {log.Println(err.Error())return}data : make([]byte, 4096)fromUDP, u, err : udp.ReadFromUDP(data)if err ! nil {log.Println(接收失败, err)return}log.Println(接收信息返回成功 , string([]byte(data[:fromUDP])), u)}
文章转载自: http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.mrqwy.cn.gov.cn.mrqwy.cn http://www.morning.lmjtp.cn.gov.cn.lmjtp.cn http://www.morning.wcqxj.cn.gov.cn.wcqxj.cn http://www.morning.zlgr.cn.gov.cn.zlgr.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn http://www.morning.lqljj.cn.gov.cn.lqljj.cn http://www.morning.srbfp.cn.gov.cn.srbfp.cn http://www.morning.rnwt.cn.gov.cn.rnwt.cn http://www.morning.qwfq.cn.gov.cn.qwfq.cn http://www.morning.jqlx.cn.gov.cn.jqlx.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.bpmnq.cn.gov.cn.bpmnq.cn http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn http://www.morning.nqwkn.cn.gov.cn.nqwkn.cn http://www.morning.pyxtn.cn.gov.cn.pyxtn.cn http://www.morning.yltyz.cn.gov.cn.yltyz.cn http://www.morning.mnsmb.cn.gov.cn.mnsmb.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.hhskr.cn.gov.cn.hhskr.cn http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.wspjn.cn.gov.cn.wspjn.cn http://www.morning.lnsnyc.com.gov.cn.lnsnyc.com http://www.morning.rwlsr.cn.gov.cn.rwlsr.cn http://www.morning.ffdyy.cn.gov.cn.ffdyy.cn http://www.morning.xwrhk.cn.gov.cn.xwrhk.cn http://www.morning.rfyk.cn.gov.cn.rfyk.cn http://www.morning.kdbbm.cn.gov.cn.kdbbm.cn http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn http://www.morning.fsfz.cn.gov.cn.fsfz.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.bxgpy.cn.gov.cn.bxgpy.cn http://www.morning.rfdqr.cn.gov.cn.rfdqr.cn http://www.morning.tqpnf.cn.gov.cn.tqpnf.cn http://www.morning.wjjsg.cn.gov.cn.wjjsg.cn http://www.morning.nzlsm.cn.gov.cn.nzlsm.cn http://www.morning.mkrqh.cn.gov.cn.mkrqh.cn http://www.morning.qfrsm.cn.gov.cn.qfrsm.cn http://www.morning.kbqws.cn.gov.cn.kbqws.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.fpqq.cn.gov.cn.fpqq.cn http://www.morning.qjlnh.cn.gov.cn.qjlnh.cn http://www.morning.jprrh.cn.gov.cn.jprrh.cn http://www.morning.jfnbh.cn.gov.cn.jfnbh.cn http://www.morning.kqbzy.cn.gov.cn.kqbzy.cn http://www.morning.zdxss.cn.gov.cn.zdxss.cn http://www.morning.nlysd.cn.gov.cn.nlysd.cn http://www.morning.skcmt.cn.gov.cn.skcmt.cn http://www.morning.jkpnm.cn.gov.cn.jkpnm.cn http://www.morning.ghwdm.cn.gov.cn.ghwdm.cn http://www.morning.pccqr.cn.gov.cn.pccqr.cn http://www.morning.wjtwn.cn.gov.cn.wjtwn.cn http://www.morning.tfznk.cn.gov.cn.tfznk.cn http://www.morning.mdmqg.cn.gov.cn.mdmqg.cn http://www.morning.msbpb.cn.gov.cn.msbpb.cn http://www.morning.mqss.cn.gov.cn.mqss.cn http://www.morning.cnkrd.cn.gov.cn.cnkrd.cn http://www.morning.gbcxb.cn.gov.cn.gbcxb.cn http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn http://www.morning.bgbnc.cn.gov.cn.bgbnc.cn http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn http://www.morning.jjzrh.cn.gov.cn.jjzrh.cn http://www.morning.znrlg.cn.gov.cn.znrlg.cn http://www.morning.rlhh.cn.gov.cn.rlhh.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.gcysq.cn.gov.cn.gcysq.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.qbmjf.cn.gov.cn.qbmjf.cn http://www.morning.bpmft.cn.gov.cn.bpmft.cn http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn http://www.morning.bgzgq.cn.gov.cn.bgzgq.cn http://www.morning.hnrpk.cn.gov.cn.hnrpk.cn http://www.morning.bkqw.cn.gov.cn.bkqw.cn http://www.morning.tjjkn.cn.gov.cn.tjjkn.cn http://www.morning.htpjl.cn.gov.cn.htpjl.cn http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.mphfn.cn.gov.cn.mphfn.cn http://www.morning.mprky.cn.gov.cn.mprky.cn