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

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))
}

修正说明

  1. 核心修复:将CreateFormFile("", fileName)改为CreateFormFile("file", fileName),指定表单字段名为file,与Python代码的字段名对齐,API即可正确解析上传的文件。
  2. 资源优化:新增defer response.Body.Close(),保证HTTP响应体被正确关闭,避免资源泄漏。
  3. 调试优化:输出响应状态信息,方便后续问题排查。

内容的提问来源于stack exchange,提问作者Ashish Kumar Saw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:25:28