Golang中转发POST请求数据的编解码问题及解决方法
AJAX POST请求转发至外部API时的编解码问题
我有一个AJAX POST请求会发送至Golang后端,目标是在将请求转发至外部API端点前对其进行修改,但即使不做修改直接转发也出现了错误。
AJAX POST请求示例
var ajaxParams = { type: 'POST', url: '/golang_endpoint', // golang backend endpoint dataType: 'json', data: encodeURIComponent(JSON.stringify(request)), // 要发送到外部端点的表单数据 success: onResponse, error: onError, }; $.ajax(ajaxParams);
对应的Golang处理器代码
func golangEndpointHandler(rw http.ResponseWriter, req *http.Request) { fmt.Println(req.PostForm) resp, err := http.PostForm("webwsite.com/outside/endpoint", req.PostForm) }
错误现象
发送POST请求时出现500内部服务器错误,例如报错信息:unexpected token at '='。打印req.PostForm的结果显示:map[{"size":"1000","other_data":12345}:[]]。
根据@belindamichaels的回复,我认为ParseForm执行的编解码操作导致转发至外部端点时出现500响应。
可行的组合方案
以下AJAX与Golang代码组合可以正常工作:
AJAX代码
var ajaxParams = { type: 'POST', url: '/golang_endpoint', dataType: 'json', processData: false, timeout: timeout, data: encodeURIComponent(JSON.stringify(request)), success: onResponse, error: onError, };
Golang代码
resp, err := http.Post("webwsite.com/outside/endpoint", req.Header.Get("Content-Type"), req.Body)
不可行的组合方案
组合1
AJAX代码
var ajaxParams = { type: 'POST', url: '/golang_endpoint', dataType: 'json', processData: false, timeout: timeout, data: request, // 未做序列化或URL编码 success: onResponse, error: onError, };
Golang代码
req.ParseForm() resp, err := http.PostForm("webwsite.com/outside/endpoint", req.PostForm)
错误:500错误,具体提示unexpected token at 'object Object]='。
组合2
AJAX代码
var ajaxParams = { type: 'POST', url: '/golang_endpoint', dataType: 'json', processData: false, timeout: timeout, data: encodeURIComponent(JSON.stringify(request)), success: onResponse, error: onError, };
Golang代码
req.ParseForm() resp, err := http.PostForm("webwsite.com/outside/endpoint", req.PostForm)
错误:500错误,具体提示unexpected token at '='。
疑问
请问在准备发送至外部端点时,如何对数据进行正确的stringify和urlencode处理?
内容的提问来源于stack exchange,提问作者Peabrain
相关产品推荐
相关产品推荐

