Go代码调用API返回500错误,Postman及Python脚本请求正常
问题:Go调用API返回500错误,Postman/Python调用正常
问题现象
- Postman和Python脚本调用目标API均返回200成功响应
- Go代码调用时返回500 Internal Server Error,页面提示:
The page cannot be displayed because an internal server error has occurred.
错误响应详情
response &{500 Internal Server Error 500 HTTP/2.0 2 0 map[Content-Type:[text/html] Date:[Wed, 16 Nov 2022 04:48:50 GMT] Server:[Microsoft-IIS/10.0] Via:[1.1 f83562bde87e361cdd8300e36b25925e.cloudfront.net (CloudFront)] X-Amz-Cf-Id:[-N4TrERntpfdaH-JVzyKbCvP7_NAwPbVWwGi6ADkcyLn45DZDXJ0gg==] X-Amz-Cf-Pop:[DEL51-P4] X-Cache:[Error from cloudfront] X-Content-Type-Options:[nosniff] X-Frame-Options:[SAMEORIGIN] X-Xss-Protection:[1; mode=block]] {0xc00042adc0} -1 [] false false map[] 0xc000194000 0xc0001a62c0}
问题Go代码
package main import ( "bytes" "fmt" "io" "io/ioutil" "log" "mime/multipart" "net/http" "os" "path" ) func main() { // make request body filePath := "/Users/ashishkumarsaw/Downloads/AdharCard.pdf" file, err := os.Open(filePath) fmt.Println("file", file) if err != nil { log.Fatalln(err) } defer file.Close() var requestBody bytes.Buffer multiPartWriter := multipart.NewWriter(&requestBody) fileName := path.Base(filePath) fmt.Println("fileName", fileName) fileWriter, err := multiPartWriter.CreateFormFile("", fileName) fmt.Println("fileWriter", fileWriter) if err != nil { log.Fatalln(err) } _, err = io.Copy(fileWriter, file) if err != nil { log.Fatalln(err) } multiPartWriter.Close() // make request url := "https://d2jpi7ffs6imr7.cloudfront.net/WealthSideAPI/api/services/app/MFPdfProcessing/ProcessMFPdf?filename=SampleCams.pdf&password=Glenn123&type=cams&clientcode=RISEA98766" req, err := http.NewRequest("POST", url, &requestBody) if err != nil { log.Fatalln(err) } req.Header.Set("Content-Type", multiPartWriter.FormDataContentType()) // perform the request and process the response client := &http.Client{} response, err := client.Do(req) fmt.Println("response", response) if err != nil { log.Fatalln(err) } body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatalln(err) } fmt.Println(string(body)) }
正常运行的Python代码
import requests url = "https://d2jpi7ffs6imr7.cloudfront.net/WealthSideAPI/api/services/app/MFPdfProcessing/ProcessMFPdf?filename=SampleCams.pdf&password=Glenn123&type=cams&clientcode=RISEA98766" payload={} files=[ ('file',('AdharCard.pdf',open('/Users/ashishkumarsaw/Downloads/AdharCard.pdf','rb'),'application/pdf')) ] headers = {} response = requests.request("POST", url, headers=headers, data=payload, files=files) print(response.text)
Python响应结果
"{\"result\":null,\"targetUrl\":null,\"success\":true,\"error\":null,\"unAuthorizedRequest\":false,\"__abp\":true}"
问题原因
对比Go和Python代码的差异:
- Python通过
('file', ...)明确指定了表单文件字段名为file - Go代码调用
CreateFormFile("", fileName)时,第一个参数(表单字段名)为空字符串,导致API无法识别上传的文件字段,进而抛出500错误
修正后的Go代码
package main import ( "bytes" "fmt" "io" "io/ioutil" "log" "mime/multipart" "net/http" "os" "path" ) func main() { filePath := "/Users/ashishkumarsaw/Downloads/AdharCard.pdf" file, err := os.Open(filePath) if err != nil { log.Fatalln(err) } defer file.Close() var requestBody bytes.Buffer multiPartWriter := multipart.NewWriter(&requestBody) fileName := path.Base(filePath) // 关键修正:指定表单字段名为"file",与Python代码保持一致 fileWriter, err := multiPartWriter.CreateFormFile("file", fileName) if err != nil { log.Fatalln(err) } _, err = io.Copy(fileWriter, file) if err != nil { log.Fatalln(err) } multiPartWriter.Close() url := "https://d2jpi7ffs6imr7.cloudfront.net/WealthSideAPI/api/services/app/MFPdfProcessing/ProcessMFPdf?filename=SampleCams.pdf&password=Glenn123&type=cams&clientcode=RISEA98766" req, err := http.NewRequest("POST", url, &requestBody) if err != nil { log.Fatalln(err) } req.Header.Set("Content-Type", multiPartWriter.FormDataContentType()) client := &http.Client{} response, err := client.Do(req) if err != nil { log.Fatalln(err) } defer response.Body.Close() // 新增:确保响应体关闭,避免资源泄漏 body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatalln(err) } fmt.Println("response status:", response.Status) fmt.Println(string(body)) }
修正说明
- 核心修复:将
CreateFormFile("", fileName)改为CreateFormFile("file", fileName),指定表单字段名为file,与Python代码的字段名对齐,API即可正确解析上传的文件。 - 资源优化:新增
defer response.Body.Close(),保证HTTP响应体被正确关闭,避免资源泄漏。 - 调试优化:输出响应状态信息,方便后续问题排查。
内容的提问来源于stack exchange,提问作者Ashish Kumar Saw
相关产品推荐
相关产品推荐

