在Golang中转发POST请求数据

eqfvzcg8  于 2023-02-01  发布在  Go
关注(0)|答案(1)|浏览(257)

我有一个AJAX发布请求,将击中Golang后端。目标是编辑此请求之前,发送请求到外部的API端点。
ajax POST请求示例:

var ajaxParams = {
    type: 'POST',
    url: '/golang_endpoint', // golang backend endpoint
    dataType: 'json',
    data: encodeURIComponent(JSON.stringify(request)), // this is the form we want to send to an external endpoint
    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转发我们的请求数据是否正确?错误表明可能与解码/编码req.PostForm或来自AJAX数据参数的数据有关?
print语句表明执行了json序列化:map[{"size":"1000","other_data":12345}:[]]
编辑:per@belindamichaels response.我相信ParseForm做了某种编码/解码,一旦发送到外部端点,会导致500个响应。
当这种组合起作用时:
一个二个一个一个
这不会:

var ajaxParams = {
    type: 'POST',
    url: '/golang_endpoint'
    dataType: 'json',
    processData: false,
    timeout: timeout,
    data: request, // not stringified or url-encoded
    success: onResponse,
    error: onError,
};
req.ParseForm()
resp, err := http.PostForm("webwsite.com/outside/endpoint", req.PostForm)

尽管没有编辑请求,我们还是得到了500(特别是unexpected token at 'object Object]=')。一旦准备好发送到外部端点,我如何对数据进行字符串化和urlencode?
注:以下组合也不起作用:

var ajaxParams = {
    type: 'POST',
    url: '/golang_endpoint'
    dataType: 'json',
    processData: false,
    timeout: timeout,
    data: encodeURIComponent(JSON.stringify(request)), // the change
    success: onResponse,
    error: onError,
};
req.ParseForm()
resp, err := http.PostForm("webwsite.com/outside/endpoint", req.PostForm)

我们得到一个类似的500错误:unexpected token at '='

mzillmmw

mzillmmw1#

要按原样转发请求,请用途:

resp, err := http.Post("webwsite.com/outside/endpoint", req.Header.Get("Content-Type"), req.Body)

如果你想编辑请求正文,服务器和客户端必须就请求正文的类型达成一致。下面是如何使用application/x-www-form-urlencoded。将表单原样传递给服务器。不要像问题中那样将表单编码为JSON。

var ajaxParams = {
    type: 'POST',
    url: '/golang_endpoint', // golang backend endpoint
    dataType: 'json',
    data: request,
    success: onResponse,
    error: onError,
};

在服务器上解析表单,编辑并发送它。

req.ParseForm()
// edit form
resp, err := http.PostForm("webwsite.com/outside/endpoint", req.PostForm

相关问题