簡體   English   中英

使用 jQuery $.ajax() 時如何使用 GET 在請求正文中發送數據

[英]How to send data in request body with a GET when using jQuery $.ajax()

我正在使用的服務 API 具有給定的 GET 方法,該方法要求在請求正文中發送數據。

正文中所需的數據是由 hypen 分隔的 id 列表,可能非常大,因此它必須在正文中發送,否則它可能會在瀏覽器/代理/網絡服務器等鏈中的某個地方出現 foobar。 請注意,我無法控制該服務或 API,因此請不要提出更改它的建議。

我正在使用以下 jQuery 代碼但是觀察提琴手中的請求/響應我可以看到我發送的“數據”總是被轉換並附加到查詢字符串,盡管我將“processData”選項設置為 false ...

$.ajax({
   url: "htttp://api.com/entity/list($body)",
   type: "GET",
   data: "id1-id2-id3",
   contentType: "text/plain",
   dataType: "json",
   processData: false, // avoid the data being parsed to query string params
   success: onSuccess,
   error: onError
});

任何人都知道我如何強制在請求正文中發送“數據”值?

通常,這不是系統使用 GET 請求的方式。 所以,很難讓你的圖書館一起玩。 事實上,規范說“如果請求方法是區分大小寫的 GET 或 HEAD 匹配,就好像數據是 null。” 所以,我認為你運氣不好,除非你使用的瀏覽器不遵守規范的那一部分。

您可以在自己的服務器上為 POST ajax 請求設置一個端點,然后在您的服務器代碼中將其重定向到帶有正文的 GET 請求。

如果您不完全依賴於以正文作為數據的 GET 請求,您有兩種選擇。

POST with data:這可能是你想要的。 如果你正在傳遞數據,那可能意味着你正在修改一些 model 或在服務器上執行一些操作。 這些類型的操作通常通過 POST 請求完成。

使用查詢字符串數據獲取:您可以將數據轉換為查詢字符串參數,並以這種方式將它們傳遞給服務器。

url: 'somesite.com/models/thing?ids=1,2,3'

眾所周知,按照http標准發送數據,我們一般使用POST請求。 但是如果你真的想在你的場景中使用 Get 發送數據,我建議你使用查詢字符串或查詢參數。

1.GET 使用查詢字符串作為. {{url}}admin/recordings/some_id

這里的some_id是要發送的強制參數,可以在服務器端使用和req.params.some_id

2. GET 使用查詢字符串作為{{url}}admin/recordings?durationExact=34&isFavourite=true

這里的 durationExact,isFavourite 是要發送的可選字符串,可以在服務器端使用req.query.durationExactreq.query.isFavourite

3. GET 發送 arrays {{url}}admin/recordings/sessions/?os["Windows","Linux","Macintosh"]

您可以像這樣在服務器端訪問這些數組值

let osValues = JSON.parse(req.query.os);
        if(osValues.length > 0)
        {
            for (let i=0; i<osValues.length; i++)
            {
                console.log(osValues[i])
                //do whatever you want to do here
            }
        }

你知道,我有一個不太標准的方法來解決這個問題。 我通常使用 nextjs。 如果可能的話,我喜歡讓事情變得平靜。 如果我需要發出 get 請求,我會改用 post 並在正文中添加一個 GET 子方法參數。 此時我的服務器端處理它。 我知道它在技術上仍然是一個 post 方法,但這使得意圖很明確,我不需要添加任何查詢參數。 然后 get 方法使用 post 方法中提供的數據處理 get 請求。 希望這會有所幫助。 這有點繞過正確的協議,但它確實意味着沒有瘋狂的變通辦法,服務器端的代碼可以毫無問題地處理它。 服務器端出現的第一件事是 if(subMethod === "GET"){|DO WHATEVER YOU NEED|}

以防萬一有人仍然提出這個問題:

任何請求中都有一個body query object。 您不需要自己解析它。

例如,如果您想使用 GET 從客戶端發送 accessToken,您可以這樣做:

 const request = require('superagent'); request.get(`http://localhost:3000/download?accessToken=${accessToken}`).end((err, res) => { if (err) throw new Error(err); console.log(res); });

服務器請求 object 然后看起來像{request: {... query: { accessToken: abcfed }... } }

我正在使用的服務API具有給定的GET方法,該方法要求在請求的正文中發送數據。

正文中所需的數據是用連字符分隔的ID列表,並且可能非常大,因此必須在正文中發送,否則可能會在瀏覽器/代理/網絡服務器等鏈中的某處出現foobar。 注意:我無法控制服務或API,因此請不要提出更改建議。

我正在使用以下jQuery代碼,但是在提琴手中觀察請求/響應,盡管我將“ processData”選項設置為false,但我仍然可以看到正在發送的“數據”始終被轉換並附加到查詢字符串中。

$.ajax({
   url: "htttp://api.com/entity/list($body)",
   type: "GET",
   data: "id1-id2-id3",
   contentType: "text/plain",
   dataType: "json",
   processData: false, // avoid the data being parsed to query string params
   success: onSuccess,
   error: onError
});

有誰知道我可以如何強制在請求正文中發送“數據”值? 感謝您的任何幫助,在此先感謝您。

暫無
暫無

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

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