簡體   English   中英

瀏覽器中 AJAX 調用的不同行為和“復制為 cURL”

[英]Different behaviour in AJAX call in browser and "Copy as cURL"

一般設置:

在 Shopware 項目中,我正在嘗試啟動並運行新版本的支付插件。 一種特定的付款方式獲得了新的 API,並且不適用於我們的暫存環境。 (本地沒問題)調試一段時間后,我可以將問題分解為 AJAX 調用,該調用應該存儲從支付服務到服務器會話的授權令牌。

這個 AJAX 調用顯示了一個超級奇怪的行為:當瀏覽器通過頁面的 JavaScript 啟動時,調用沒有按預期工作。 發送的令牌未存儲在 REDIS 存儲中,我找不到任何響應正文(應該包含調試輸出)。 無論如何,我得到了 200 響應代碼。 最讓我煩惱的是,當我使用開發人員工具的“Copy as cURL”功能並將其粘貼到我的命令行或 Insomnia GUI 客戶端時,一切都按預期工作。 會話值存儲。 收到調試輸出。

所以我的實際問題是:當我通過從開發工具復制它們來確保它們使用完全相同的參數和標頭時,來自瀏覽器的請求與 curl 或 Insomnia 發出的請求有何不同? 我是不是叫錯了樹,這只是時間問題? (然后出現了這樣的請求如何會因為時機不當而失敗的問題。)

我正在嘗試提供更多背景信息:控制器代碼非常簡單(是的,“受保護”確實看起來很奇怪,似乎是一些使其工作的商店特殊功能)

protected function storeAuthorizationTokenAction()
    {
        $this->container->get('front')->Plugins()->ViewRenderer()->setNoRender();

        $token = $this->request->getParam('authorizationToken');

        $this->session->offsetSet('mopt_klarna_authorization_token', $token);
    }

Shopware 版本:5.4.3,支付插件(此代碼來自):PayOne 4.3.1
這是卷曲請求。 最初它應該是一個 POST,一個調試嘗試是使它成為一個 GET。 但是,它不會改變行為。 cURL 有效,瀏覽器中的原始請求無效。

curl 'https://<domain>/de/MoptAjaxPayone/storeAuthorizationToken?authorizationToken=20ae061a-b8cd-2008-a7f9-84e94ca71523' \
  -H 'authority: <domain>' \
  -H 'pragma: no-cache' \
  -H 'cache-control: no-cache' \
  -H 'accept: */*' \
  -H 'x-csrf-token: KgDxrkUB3KkbVOHWSwEOUWVIWpRHJL' \
  -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36' \
  -H 'x-requested-with: XMLHttpRequest' \
  -H 'sec-fetch-site: same-origin' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: https://<domain>/de/checkout/shippingPayment/sTarget/checkout' \
  -H 'accept-language: de,da;q=0.9,it;q=0.8,en-US;q=0.7,en;q=0.6' \
  -H 'cookie: _ga=GA1.2.1339746099.1600161423; _gid=GA1.2.787319341.1603793583; x-ua-device=desktop; __utmzz=utmcsr=(direct)|utmcmd=(none)|utmccn=(not set); __utmzzses=1; _fbp=fb.1.1603793583917.1305294048; __csrf_token-1=KgDxrkUB3KkbVOHWSwEOUWVIWpRHJL; scarab.visitor=%2247EEF371B0831C41%22; BasketToken_SfXEGBXzFnFsiZY8z4mKdqvDl8BICC6B=BgSmkYYV9xE3N56RIumHFJi6YvNaOz8FfeymjKCJZHZKJULmQp; shopSelected=true; layerLanguage=de; layerCountry=2; BasketToken_gLjjyccOBRSrepPczTlbSRAbfmSrBh2p=YvCgZrhAAINEJkcJppJ3mk4eykbjSSsiExGh5dIK3t1ZwZzJu2; gender=/de/damen; scarab.mayAdd=%5B%7B%22i%22%3A%224333421%2520100%252034%22%7D%2C%7B%22i%22%3A%226368511%2520122%252046%22%7D%2C%7B%22i%22%3A%224331722%2520101%252032%22%7D%5D; nocache=detail-1%2C+checkout-1; session-1=glntj79ep8si7pah9c4fjfnpk7; slt=a2527090-a6e8-4cbd-83df-da52afd4bd0f.1; BasketToken_0D94YPGBB6uBsFTn6pegR4wpilYwkIiO=GRlVSQ8XqTBKW7o1wy0l3EVBXRvcPnCmQfwddxa9Dwygm8IPC1; x-cache-context-hash=31b937a0b05d5618b106ef9e865d2507e7771077; _gat_UA-48161381-13=1; _uetsid=a3b0cc00177211ebbd7c65d866bae873; _uetvid=3d0f5d4a49d80e3f35cd03b932b1ec0c' \
  --compressed

如果我能提供任何進一步的信息,請告訴我。

經過更多的研究,這是我的答案:

由於表單提交,請求已被瀏覽器取消。 請注意瀏覽器之間的不同行為:Firefox 為我指明了正確的方向,因為它甚至不會嘗試等待答案。 提交表單的那一刻,瀏覽器取消請求。 在服務器端,在這種情況下,nginx 記錄 499。FF 開發工具根本不顯示響應代碼。 另一方面,Chrome 只是不等待答案,而是顯示沒有正文的 200 OK 響應。

解決辦法是讓ajax請求同步。

暫無
暫無

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

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