Golang 的 Sling 库使用(http 客户端)

Http的四种常见的POST提交数据方式

服务端通常根据请求头(headers) 中的 Content-Type 字段来获取请求中的消息主体是用何种方式编码,再对主体进行解析。这也正好解释了POST请求要先将请求头发送,再发送请求体。

Content-Type 指定了消息主体中的编码方式


因此,POST请求提交数据的方案,直接和Content-Type 和 消息主体两部分有关


http请求常见的Content-Type 分为四种:

  • application/json
  • x-www-form-urlencode
  • multipart/form-data
  • text/plain

在这里插入图片描述

1、application/x-www-form-urlencoded

http 中默认的提交数据的方式。浏览器的原生表单,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded 方式提交数据,但在用于文本传输和MP3等大型文件的时候,这种编码的效率低下。

2、multipart/form-data

指定传输的数据为二进制类型,如图片、mp3、文件等。该格式会生成一个 boundary 字符串来分割请求头和请求体。

请求体内容各字段之间也有boundary 分割、但和分割请求头和请求体的boundary不同,且结束请求体也有一个boundary ,也是不一样的。

它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type 来表明文件的类型。

content-disposition ,用来说明字段的一些信息

由于有boundary的隔离,所以multipart/form-data 既可以上传文件,也可以上传键值对。
它采用了键值对的方式,所以可以上传多个文件。

数据包说明

首先生成了一个boundary用于分割不同的字段,为了避免与正文内容重复,boundary很长很复杂。然后Content-Type里指明数据是以 multipart/form-data 编码的。本次请求的boundary是什么内容。消息主体按照字段的个数又分为多个结构体类似的部分,每部分都是以 -boundary开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包括文件名和文件类型信息。消息主体最后以 -boundary- 标示结束。

这种方式一般用于上传文件,各大服务端语言对其有良好支持。

3、application/json

application/json 作为请求头,用来告诉服务端消息主体是序列化的JSON字符串。方便提交复杂的数据化结构,特别适合RESTful风格的接口

4、text/xml

使用http作为用户传输协议,xml作为编码方式的远程调用规范。

HTTP请求返回结果

返回时 ,json乱码的问题

可能出现的原因:

1、GBK 和UTF-8的编码方式不同,试着转换一下

2、accept-encoding 影响

请求的时候设置了header accept-encoding为gzip 导致如何解析都是乱码。

原因是内容被gzip压缩,在网页请求的时候为了减小网页请求所消耗的带宽,提高数据传输的速度,通常会把数据进行压缩传输,设置accept-encoding为gzip ,deflate,br 代表数据压缩使用的编码方式

还需要关注一个值 Content-encoding (响应头中)

Content-encoding 指服务端的使用的是哪种压缩方式传输数据给你,accept-encoding 表示你发送请求时告诉服务器我可以使用哪些编码 解压缩服务器返回的数据。

服务端会根据你发送的 accent-encoding 来决定使用什么格式的content-encoding。

Sling 库

前言

Sling库是用于创建和发送API请求的GO http客户端库。

项目开发中发送http请求的场景,推荐使用sling库。Sling 本身是基于net/http 来处理发送请求,同时做了较好的封装,可以利用net/http 的一些特性(如 http trace),同时不必关心net/http 库的一些琐碎细节。

在这里插入图片描述

Sling 默认实现可以覆盖大部分对于http发送请求场景,同时可以通过实现Doer 和ResponseDecoder 接口来扩展个性化场景。

Sling 支持以下的主要功能:

  • 支持GET/POST/PUT/PATCH/DELETE/HEAD
  • 基于Base/Path 可以扩展和复用Sling
  • query参数可以用结构体来Encode
  • Request Body 支持 form 和json
  • 可将Json 格式的 Response直接Decode到定义好的结构体
  • 可扩展Response的Decoder,以及Doer。

2、Sling 使用方法

https://pkg.go.dev/github.com/dghubble/sling?utm_source=godoc
【GoCN酷Go推荐】灵活的Go http client库-Sling
参考URL: https://jishuin.proginn.com/p/763bfbd5b75f

Sling对http请求的要素method、baseUrl、Path、query、body、request、response等做了封装,基本使用可以参考https://github.com/dghubble/sling 上的示例代码。

可以通过实现ResponseDecoder和Doer的接口,来定制响应的decoder和发送请求的具体实现。

3、Sling 扩展

每个Sling 都会创建一个标准的 http.request 。
Request() 调用(例如,使用某些路径和查询参数)。您可能希望扩展现有的Sling以最大限度地从减少重复(例如常见客户端或基本URL)

每个Sling实例都提供了一种创建一个独立副本的New()方法,因此,子组的设置属性不会使父Sling 变异。(一个Sling可以new一个子sling,这个sling设置的属性不会影响父sling)
在这里插入图片描述

如下图,创建一个结构体在new 的函数生成一个sling实例,以后调用别的函数就可以直接使用

在这里插入图片描述
在这里插入图片描述


Sling 源码不支持multipart/form-data
Sling 本质还是使用的http 标准库


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准中的"net/http"包提供了构建WebSocket服务器和客户的功能。 首先,我们来看一下如何使用Gin和WebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用Golang和Gin构建WebSocket客户。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户,它使用WebSocket标准中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang Gin和WebSocket构建WebSocket客户和服务器的简单示例。这些代码可以帮助我们使用Gin和Golang的标准来构建强大的Web应用程序,并处理WebSocket通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值