You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中POST请求发送form-data报Bad Request错误排查

问题:Golang发送form-data POST请求返回Bad Request的原因

我尝试通过POST请求发送form-data,该API在Postman中测试正常,但使用Golang实现时遇到问题。form-data包含task字段和file字段,执行以下代码后返回Bad Request,请问可能的原因是什么?感谢解答。

// Create new buffer and writer
buf := new(bytes.Buffer)
w := multipart.NewWriter(buf)


// read data from file
var fdata []byte
if fd, e := os.Open(pdf); e != nil {
    log.Fatal(e)        
} else {
    fd.Read(fdata)
}
        
// create file field and write
part, err := w.CreateFormFile("file", pdf) 
if err != nil {
    log.Fatal(err)
}
part.Write(fdata)



// create the task field and write
part, err = w.CreateFormField("task") 
if err != nil {
    log.Fatal(err)
}

part.Write([]byte(os.Getenv("task")))

w.Close()

// Create a new request
req, err := http.NewRequest("POST", fmt.Sprintf("https://%v/v1/upload",os.Getenv("server")), buf)


// Set content type header
req.Header.Add("Content-Type", "multipart/form-data")


// Send the request
client := &http.Client{}
    
resp, err := client.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()


// other stuff

可能的原因及修正方案

  • Content-Type头缺失boundary:
    手动设置multipart/form-data时没有携带boundary参数,服务器需要通过boundary来分割form-data中的各个字段。正确做法是使用multipart.Writer提供的FormDataContentType()方法获取完整的Content-Type值:

    req.Header.Set("Content-Type", w.FormDataContentType())
    
  • 文件读取失败(空内容):
    代码中var fdata []byte初始化了空切片,fd.Read(fdata)无法将文件内容写入空切片(切片长度为0),导致上传的文件内容为空。同时未关闭文件句柄、未检查读取错误。可改用os.ReadFile简化读取逻辑:

    fdata, err := os.ReadFile(pdf)
    if err != nil {
        log.Fatal(err)
    }
    
  • 未处理任务字段空值:
    如果os.Getenv("task")返回空字符串,可能不符合API对task字段的必填要求,建议添加环境变量存在性检查。

修正后的完整代码示例

package main

import (
    "bytes"
    "fmt"
    "log"
    "mime/multipart"
    "net/http"
    "os"
)

func main() {
    pdf := "path/to/your/file.pdf" // 替换为实际文件路径
    taskValue := os.Getenv("task")
    if taskValue == "" {
        log.Fatal("task环境变量未设置")
    }
    server := os.Getenv("server")
    if server == "" {
        log.Fatal("server环境变量未设置")
    }

    buf := new(bytes.Buffer)
    w := multipart.NewWriter(buf)

    // 读取文件内容
    fdata, err := os.ReadFile(pdf)
    if err != nil {
        log.Fatal(err)
    }

    // 创建file字段并写入内容
    part, err := w.CreateFormFile("file", pdf)
    if err != nil {
        log.Fatal(err)
    }
    _, err = part.Write(fdata)
    if err != nil {
        log.Fatal(err)
    }

    // 创建task字段并写入内容
    part, err = w.CreateFormField("task")
    if err != nil {
        log.Fatal(err)
    }
    _, err = part.Write([]byte(taskValue))
    if err != nil {
        log.Fatal(err)
    }

    // 关闭writer,确保所有数据写入缓冲区
    err = w.Close()
    if err != nil {
        log.Fatal(err)
    }

    // 创建请求
    req, err := http.NewRequest("POST", fmt.Sprintf("https://%v/v1/upload", server), buf)
    if err != nil {
        log.Fatal(err)
    }

    // 设置正确的Content-Type头
    req.Header.Set("Content-Type", w.FormDataContentType())

    // 发送请求
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    // 后续处理逻辑...
}

内容的提问来源于stack exchange,提问作者Raiyan Jamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:50:24