我有一个类似这样的卷曲请求
curl -X POST https://kon-stage-ew1.pet.io/predict/pet-find/v1/predict \
-H 'x-kon-Predict-Backend: https://kon-94fkr5wXRCeNu3IiDXzXFg-stage.cloud.pet.io' \
-H 'x-analyzer-id: Feature:pet-find:Service-33f50d68d3db4fec9c75b73d3b83e016' \
-H 'x-api-key: redStagekey' \
-F 'properties={}' \
-F content=@/Users/peter/Documents/01.jpg
此curl请求的python http看起来像这样
image1 = '01.jpg'
headers = {
'x-kon-Predict-Backend': 'https://kon-94fkr5wXRCeNu3IiDXzXFg-stage.cloud.pet.io',
'x-analyzer-id': 'Feature:pet-find:Service-33f50d68d3db4fec9c75b73d3b83e016',
'x-api-key': 'redStagekey',
}
payload = {'properties':'{}'}
files = {
'content':open(image1, 'rb')
}
response = requests.post('https://kon-stage-ew1.pet.io/predict/pet-find/v1/predict', headers=headers, data = payload, files=files)
return response.content
我想将此转换为等效的Golang http请求。我尝试了多个Golang库,例如grequests,http和此处的博客文章https://matt.aimonetti.net/posts/2013-07-golang-multipart-file-upload-example/但是它们似乎都不起作用。这是我尝试过的示例grequest
package main
import (
"github.com/levigross/grequests"
"fmt"
)
func main(){
url := "https://kon-stage-ew1.pet.io/predict/exposure-defect/v1/predict"
headers := map[string]string{
"x-kon-Predict-Backend": "https://kon-94fkr5wXRCeNu3IiDXzXFg-stage-eu-west-1.stage.cloud.pet.io",
"x-analyzer-id": "Feature:pet-find:Service-33f50d68d3db4fec9c75b73d3b83e016",
"x-api-key": "redStageKey",
}
payload := map[string]string{
"properties":"{}",
}
file_upload, err := grequests.FileUploadFromDisk("/Users/akhikuma/Documents/01.jpg")
if err != nil {
fmt.Println("Unable to open file: ", err)
}
ro := &grequests.RequestOptions{
Headers: headers,
Files: file_upload,
Data: payload,
}
resp, err := grequests.Post(url,ro)
if err!=nil {
fmt.Println("Something wrong happened in post request: ", err)
fmt.Println(err)
}
fmt.Println(resp)
if resp.Ok != true {
fmt.Println("Request did not return OK")
}
}
这给我以下错误
{"status_code": 400, "reason": "('Content data is missing. Check multipart file upload.', 400)"}
Request did not return OK
我还尝试使用邮递员将curl请求转换为golang,但由于请求包含上载文件,因此它也不起作用。
注意,在python代码中,我只是不发送文件,而是发送文件的字典。我尝试使用邮递员将curl请求转换为Golang,但由于我们还必须将文件作为有效载荷的一部分发送,因此它不起作用。
感谢您的帮助。
将文件放在go文件的同一目录中,尝试这段代码。我遇到过
no such host error
,但我认为这会起作用。
package main
import (
"bytes"
"fmt"
"io"
"log"
"mime/multipart"
"net/http"
"os"
"path/filepath"
)
func main() {
path, _ := os.Getwd()
path += "/your/filename/here"
url := "https://kon-stage-ew1.pet.io/predict/exposure-defect/v1/predict"
file, err := os.Open(path)
if err != nil {
log.Fatal(err)
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("content", filepath.Base(path))
if err != nil {
log.Fatal(err)
}
_, err = io.Copy(part, file)
err = writer.WriteField("properties", "{}")
if err != nil {
log.Fatal(err)
}
err = writer.Close()
if err != nil {
log.Fatal(err)
}
client := http.Client{}
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("x-kon-Predict-Backend", "https://kon-94fkr5wXRCeNu3IiDXzXFg-stage-eu-west-1.stage.cloud.pet.io")
req.Header.Set("x-analyzer-id", "Feature:pet-find:Service-33f50d68d3db4fec9c75b73d3b83e016")
req.Header.Set("x-api-key", "redStageKey")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
} else {
body := &bytes.Buffer{}
_, err := body.ReadFrom(resp.Body)
if err != nil {
log.Fatal(err)
}
resp.Body.Close()
fmt.Println(resp.StatusCode)
fmt.Println(resp.Header)
fmt.Println(body)
}
}