簡體   English   中英

Golang轉發POST請求數據

[英]Forwarding POST request data in Golang

我有一個 AJAX post 請求將到達 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 數據參數的數據?

打印語句表明執行了 json 序列化: map[{"size":"1000","other_data":12345}:[]]

編輯:根據@belindamichaels 的回復。 我相信ParseForm會進行某種編碼/解碼,一旦發送到外部端點就會導致 500 個響應。

雖然這種組合有效:

var ajaxParams = {
    type: 'POST',
    url: '/golang_endpoint'
    dataType: 'json',
    processData: false,
    timeout: timeout,
    data: encodeURIComponent(JSON.stringify(request)),
    success: onResponse,
    error: onError,
};
resp, err := http.Post("webwsite.com/outside/endpoint", req.Header.Get("Content-Type"), req.Body)

這不會:

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 '='

要按原樣轉發請求,請使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM