Golang中http编程

简介: Golang中http编程

http介绍

编写web语言:

1.java

2.php,现在都在尝试用go语言编写

3.python,豆瓣

4.go语言 ===》 beego,gin两个主流的web框架

https协议:我们使用浏览器访问的时候发送的就是http请求

  1. http是应用层的协议,底层还是依赖传输层:tcp(短链路),网络层(ip)
  2. 无状态的,每一次请求都是独立的,下次请求要重新建立连接
  3. https:
    http是标准协议==》明文传输,不安全
    https不是标准协议==》https = http+ssl(非对称加密,数字证书)-》加密的
    现在所有网站都会尽量要求https开发:安全

http请求报文格式

一个http请求可以分为4个部分:

1.请求行 2.请求头 3.空行 4.请求包体

http响应消息格式

http响应格式也分为4部分:

  1. 第一部分:状态行
    协议格式:协议版本号 + 状态码 + 状态描述
    实例1:HTTP/1.1 + 200 + ok
    实例2:HTTP/1.1 + 404 + Page not found
    常用的状态码:
    1xx -> 客户端可以继续发送请求
    2xx-> 正常访问,200
    3xx-> 重定向
    4xx -> 401(未授权) not authorized 404(not found)
    5xx-> Internal Error 服务器内部错误
  2. 第二部分:响应头
    Content-Type:application/json
    Server:Apache
    Data:Mon,12 Sep…
  3. 第三部分:空行
    用于分割,没有响应头了
  4. 第四部分:响应包体
    通常是返回json数据

http响应代码演示

package main 
import (
  "fmt"
  "net/http"
  "io/ioutil"
)
func main() {
  //http包
  client := http.Client{}
  // func (c *Client) Get(url string) (resp *Response,err error){
  resp,err := client.Get("https://www.baidu.com")
  if err != nil{
    fmt.Println("Client.Get err:",err)
    return
  }
  // 放在上边,内容很多
  body := resp.Body
    fmt.Println("body 111:",body)
    // func ReadAll(r io.Reader) ([]byte,error){
  // }
  readBodyStr,err := ioutil.ReadAll(body)
  if err != nil{
    fmt.Println("read body err:",err)
    return
  }
  fmt.Println("body string:",string(readBodyStr))
  ct := resp.Header.Get("Content.Type")
  date := resp.Header.Get("Date")
  server := resp.Header.Get("Server")
  fmt.Println("content-type:",ct)
  fmt.Println("date:",date)
  fmt.Println("server:",server)
  url := resp.Request.URL
  code := resp.StatusCode
  status := resp.Status 
  fmt.Println("url:",url)
  fmt.Println("code:",code)
  fmt.Println("status:",status)
}

http-server代码实现

package main 
import (
  "net/http"
  "fmt"
  "io"
)
  
func main(){
  // 注册路由router
  // xxx/user ===> func1
  // xxx/name ===> func2
  // xxx/id ===> func3
  // https://127.0.0.1:8080/user,func是回调函数,用于路由的响应,这个回调函数原型是固定
  http.HandleFunc("/user",func(writer http.ResponseWriter,request *http.Request){
    // request :===> 包含客户端发来的数据
    fmt.Println("用户请求详情:")
    fmt.Println("request:",request)
    // writer :===> 通过writer将数据返回给客户端
    _,_ = io.WriteString(writer,"这是/user请求返回的数据!")
  })
  http.HandleFunc("/name",func(writer http.ResponseWriter,request *http.Request){
    _,_ = io.WriteString(writer,"这是/name请求返回的数据!")
  })
  http.HandleFunc("/id",func(writer http.ResponseWriter,request *http.Request){
    _,_ = io.WriteString(writer,"这是/id请求返回的数据!")
  })
  fmt.Println("Http Server start ...")
  // func ListenAndServe(addr string,handler Handler) error{
  // http.ListenAndServe()
  if err := http.ListenAndServe("127.0.0.1:8080",nil);err != nil{
    fmt.Println("http start failed,err:",err)
    return
  }
}

JSON编解码案例

package main 
import (
  "fmt"
  "encoding/json"
)
type Student struct{
  Id int 
  Name string
  Age int 
  gender string // 注意:gender是小写的
}
func main(){
  // 在网络中传输的时候,把Student结构体,编码成json字符串,传输 ===》 结构体 ===》 字符串 ==》 编码
  // 接收字符串,需要将字符串转换成结构体,然后操作==》字符串==》结构体==》解密
  lily := Student{
    Id:1,
    Name:"Lily",
    Age:20,
    gender:"女士",
  }
  // 编码(序列化),结构==》字符串
    encodeInfo,err := json.Marshal(&lily)
    if err != nil{
      fmt.Println("json.Marshal err:",err)
      return
    }
    fmt.Println("encodeInfo:",string(encodeInfo))
    // 对端接收到数据
    // 反序列化(解码):字符串=》结构体
    var lily2 Student
    // func Unmarshal(data []byte,v interface{}) error {
    if err := json.Unmarshal([]byte(encodeInfo),&lily2);err != nil{
      fmt.Println("json.Unmarshal err:",err)
      return
    }
    fmt.Println("name:",lily2.Name)
    fmt.Println("gender:",lily2.gender)
    fmt.Println("age:",lily2.Age)
    fmt.Println("id:",lily2.Id)
}

注意:由于gender在结构体中首字母是小写开头的,json编码不会参与编码

结构体标签(tag)

package main 
import (
  "encoding/json"
  "fmt"
)
type Teacher struct {
  Name string `json:"-"`                        // ==>在使用json编码时,这个编码不参与
  Subject string `json:"Subject_name"`          // ==> 在json编码时,这个字段会编码成Subject_name
  Age int `json:"age,string"`   // ==>在json编码时,将age转成string类型,一定要两个字段:名字,类型,中间不能有空格
  Address string `json:"address,omitempty"` // ==>在json编码时,如果这个字段是空的,那么忽略,不参与编码
  // 注意:gender是小写的,小写字母开头的,在json编码时会会忽略掉
  gender string
}
func main(){
  t1 := Teacher{
    Name:"Duke",
    Subject:"Golang",
    Age:18,
    gender:"Man",
    Address:"北京",
  }
  fmt.Println("t1",t1)
  encodeInfo,_ := json.Marshal(&t1)
  fmt.Println("encodeInfo:",string(encodeInfo))
}

总结

1.对于结构体进行编码时(json),字段的首字母必须大写,否则无法编码

2.如果json格式要求key小写,那么可以通过标签(tag)来解决

3. tag细节

Name string `json:"-"`                        // ==>在使用json编码时,这个编码不参与
  Subject string `json:"Subject_name"`          // ==> 在json编码时,这个字段会编码成Subject_name
  Age int `json:"age,string"`   // ==>在json编码时,将age转成string类型,一定要两个字段:名字,类型,中间不能有空格

感谢大家观看,我们下次见

目录
相关文章
|
2天前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
16 1
|
2天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
15 1
|
3天前
|
Go 开发者
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第24天】Go语言的`net/http`包在HTTP客户端编程中扮演重要角色,但使用时需注意几个常见问题:1) 检查HTTP状态码以确保请求成功;2) 记得关闭响应体以防止资源泄漏;3) 设置超时限制,避免长时间等待;4) 根据需求处理重定向。理解这些细节能提升HTTP客户端编程的效率和质量。
15 1
|
5天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
2月前
|
存储 IDE 编译器
编程笔记 GOLANG基础 005 第一个程序:hello world 使用vscode
编程笔记 GOLANG基础 005 第一个程序:hello world 使用vscode
|
2月前
|
Go 开发工具
编程笔记 GOLANG基础 004 GOLANG常用命令及VSCODE快捷键
编程笔记 GOLANG基础 004 GOLANG常用命令及VSCODE快捷键
|
2月前
|
Go 开发工具 git
编程笔记 GOLANG基础 003 Go语言开发环境搭建
编程笔记 GOLANG基础 003 Go语言开发环境搭建
|
2月前
|
存储 Java Go
编程笔记 GOLANG基础 002 Go语言简介
编程笔记 GOLANG基础 002 Go语言简介
|
11天前
|
XML Java 数据格式
Servlet 教程 之 Servlet 客户端 HTTP 请求 3
该教程展示了如何在Servlet中处理客户端HTTP请求,特别是获取HTTP头信息。示例代码创建了一个名为`DisplayHeader`的Servlet,它扩展了`HttpServlet`并重写了`doGet`方法。在`doGet`中,使用`HttpServletRequest`的`getHeaderNames()`遍历所有头部,显示其名称和对应值。Servlet在TomcatTest项目下,通过`web.xml`配置映射到`/TomcatTest/DisplayHeader`路径。
29 14
|
11天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
21 8