Go 发送application/octet-stream(binaryl)类型请求

什么是binaryl类型

在Chrome浏览器的Postman工具中,可以看到”binary“这一类型,指的就是一些二进制文件类型。如application/pdf,指定了特定二进制文件的MIME类型。就像对于text文件类型若没有特定的子类型(subtype),就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,就使用 application/octet-stream,这是应用程序文件的默认值,一般很少直接使用 。

application/octet-stream

application/octet-stream content-type 用于传输 HTTP 请求正文中的二进制数据。因此application/octet-stream用于通过 HTTP 请求发送文件

GO语言如何发送binaryl类型请求

我们先创建两个文件夹。

  • 客户端
  • 服务端

另外,在客户端文件夹中创建一个名为photo.png的文件

HTTP 客户端示例

客户端/main.go

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"
)

func main() {
    err := call("http://localhost:8080/photo", "POST")
    if err != nil {
        fmt.Printf("Error occurred. Err: %s", err.Error())
    }
}

func call(urlPath, method string) error {
    client := &http.Client{
        Timeout: time.Second * 10,
    }

    b, err := ioutil.ReadFile("photo.png")
    if err != nil {
        return err
    }

    req, err := http.NewRequest(method, urlPath, bytes.NewReader(b))
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", "application/octet-stream")
    rsp, _ := client.Do(req)
    if rsp.StatusCode != http.StatusOK {
        log.Printf("Request failed with response code: %d", rsp.StatusCode)
    }
    return nil
}

在上面的程序中,我们将文件photo.png作为POST 请求中的application/octet-stream请求正文发送。photo.png 首先转换为字节,这些字节作为application/octet-stream主体发送。为此,首先读取文件的字节

b, err := ioutil.ReadFile("photo.png")

将文件转换为字节后,将其传递给http.NewRequest方法,如下所示第三个参数

bytes.NewReader(b)

bytes.NewReader返回bytes.Reader实例bytes.Reader实现了io.Readerio.Writer。http.NewRequest方法接受io.Reader作为正文部分。因此bytes.Reader实例可以作为第三个参数传递给 http.NewRequest

req, err := http.NewRequest(method, urlPath, bytes.NewReader(b))

同样在上面的程序中,我们正在调用下面的 API

http://localhost:8080/photo

让我们创建一个侦听端口8080的服务器,以便我们也可以测试上述客户端。此外,服务器将解析 application/octet-stream 正文并将其保存为photo.png。现在让我们看看服务器的程序

HTTP 服务器示例

下面是相同的程序。

服务器/main.go

package main

import (
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    createEmployeeHanlder := http.HandlerFunc(createEmployee)
    http.Handle("/photo", createEmployeeHanlder)
    http.ListenAndServe(":8080", nil)
}

func createEmployee(w http.ResponseWriter, request *http.Request) {
    d, err := ioutil.ReadAll(request.Body)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
    }
    tmpfile, err := os.Create("./" + "photo.png")
    defer tmpfile.Close()
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
    }
    tmpfile.Write(d)

    w.WriteHeader(200)
    return
}

在上面的程序中,我们创建了一个监听 8080 端口的 API。API 签名将是

http://localhost:8080/photo

它从 POST 正文中读取字节并将它们保存到文件photo.png

让我们同时运行服务器和客户端。首先运行服务器。

go run server/main.go

它将开始侦听端口 8080。然后运行客户端。

go run client/main.go
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇