1.1 web工作方式

 Go语言基础之19--web编程基础

1.2 HTTP协议详解

 a、http 请求包体

GET /domains/example/ HTTP/1.1 //请求行: 请求方法 请求URI HTTP协议/协议版本

Host:www.iana.org //服务端的主机名

User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko)

Chrome/22.0.1229.94 Safari/537.4 //浏览器信息

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //客户

端能接收的MIME

Accept-Encoding:gzip,deflate,sdch //是否支持流压缩

Accept-Charset:UTF-8,*;q=0.5 //客户端字符编码集

//空行,用于分割请求头和消息体  

//消息体,请求资源参数,例如POST传递的参数

b、http 响应包体

HTTP/1.1 200 OK //状态行

Server: nginx/1.0.8 //服务器使用的WEB软件名及版本

Date:Date: Tue, 30 Oct 2012 04:14:25 GMT //发送时间

Content-Type: text/html //服务器发送信息的类型

Transfer-Encoding: chunked //表示发送HTTP包是分段发的

Connection: keep-alive //保持连接状态

Content-Length: 90 //主体内容长度

//空行 用来分割消息头和主体 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... //消息体

1.3 http Keep-Alive特性

A. Keep-Alive用来保持连接

B. Keep-Alive通过web服务器(nginx、httpd)进行设置,保持的时间

1.4 web程序开发

A. 标准包 “net/http”封装web服务相关功能

B. 使用简单、性能媲美nginx。

 

实例:

package main

import (
    "fmt"
    "log"
    "net/http"
    "strings"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) { //第一个参数是一个接口,第二个参数是一个结构体(封装了一系列方法,比如:取post提交参数等),r是接受请求,w是返回给浏览器
    r.ParseForm()                       //解析参数,默认是不会解析的,如果是post请求(带表单参数),会进行解析
    fmt.Println(r.Form)                 //这些信息是输出到服务器端的打印信息,将表单打印出来
    fmt.Println("path", r.URL.Path)     //请求路径
    fmt.Println("scheme", r.URL.Scheme) //scheme是http还是https
    fmt.Println(r.Form["url_long"])     //传递了一个表单参数url_long
    for k, v := range r.Form {
        fmt.Println("key:", k)
        fmt.Println("val:", strings.Join(v, ""))
    }
    fmt.Fprintf(w, "Hello world!") //这个写入到w的是输出到客户端的
    //w这里是一个接口,接口的好处就体现在封装成一个接口的话,不论是返回文件或者图片或者html都可以通过接口进行返回,不用接口的话,你需要为每一种返回类型写函数。帮你更好理解

}
func main() {
    http.HandleFunc("/", sayhelloName)       //设置访问的路由,sayhelloName是函数类型的参数
    err := http.ListenAndServe(":9090", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

 执行结果:

Go语言基础之19--web编程基础

浏览器端:

Go语言基础之19--web编程基础

 

 

实例:获取用户传递过来的参数

package main

import (
    "fmt"
    "net/http"
)

func greet(w http.ResponseWriter, r *http.Request) {
    word := r.FormValue("word")  //通过formvalue来获取用户传递过来参数
    fmt.Fprintf(w, "greet Hello World! word:%s", word)
}

func main() {
    http.HandleFunc("/index", greet)
    http.ListenAndServe(":8080", nil)
}

 执行结果:

Go语言基础之19--web编程基础

浏览器端:

Go语言基础之19--web编程基础

1.5 Golang web服务工作方式

 图1:

Go语言基础之19--web编程基础

go底层源码就是我们上面图示的体现:

绑定监听端口:

 Go语言基础之19--web编程基础

Go语言基础之19--web编程基础

进入服务阶段(死循环,所以不停服务):

Go语言基础之19--web编程基础

Go语言基础之19--web编程基础

客户端来一个请求连接,就accept起一个,完了最后通过起一个协程来处理当前连接的这个请求。

go语言里面网络编程模型很简单,就是过来一个连接,起一个goroutine去处理这个连接请求。如果是nginx、c++、c等就需要做一个异步的epoll处理模型,go就非常简单,源码就和上面一样,所以以后要写一个tcp服务器,将上面源码搬过去就可以用。

图2为图1的精细化展示:

Go语言基础之19--web编程基础

二、表单提交

A. html代码中通过<form> </form>括起来的区域,允许用户提交数据。

B.  Go对于表单处理非常方便

 

实例:

目录结构:

Go语言基础之19--web编程基础

login.html:

<html>
    <body>
        <form action="/user/login" method="POST">
            <div>
                <span>用户名:</span><input name="username" >
            </div>
            <div>
                <span>密码:</span><input name="password" >
            </div>
            <div>
                    <input type="submit" value="提交">
            </div>
        </form>
    </body>
</html>
login.html

相关文章:

  • 2022-03-05
  • 2022-01-26
  • 2021-08-24
  • 2021-08-05
猜你喜欢
  • 2021-12-02
  • 2022-12-23
  • 2021-06-02
  • 2021-11-11
相关资源
相似解决方案