什么是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.Reader和io.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