Shopify API 跨域 Ajax 请求

Posted

技术标签:

【中文标题】Shopify API 跨域 Ajax 请求【英文标题】:Shopify API Cross Domain Ajax Request 【发布时间】:2018-03-07 05:59:24 【问题描述】:

我正在使用以下代码从 shopify 获取客户详细信息。我已将我的域从 shopify 管理员重定向到另一个域。

function setEmailWithLoggedInUser(callback) 
$.ajax(
      url: 'https://new-website-shopify.myshopify.com/admin/customers/'+__st.cid+'.json',
      crossDomain: true,
      beforeSend: function(xhr) 
           xhr.setRequestHeader("Authorization", "Basic XXXXXXXXXXXX")
      , success: function(data)

          console.log(data);

          if(callback)
            callback();      
         
)  

我已经做了很多工作,但无法找到解决方案。 我收到此错误:

加载资源失败:服务器响应状态为 404 (未找到)

XMLHttpRequest 无法加载 https://new-website-shopify.myshopify.com/admin/customers/7094124372.json。 对预检请求的响应未通过访问控制检查:

请求中没有“Access-Control-Allow-Origin”标头 资源。原点 'https://www.beirutshopping.com' 因此不是 允许访问。响应的 HTTP 状态代码为 404。

【问题讨论】:

“服务器响应状态为 404(未找到)” 是根本问题。您看到“请求的资源上没有'Access-Control-Allow-Origin'标头。”的唯一原因是大多数服务器没有添加像Access-Control-Allow这样的标头-Origin 标头到 4xx 错误响应——相反,服务器通常只将这些标头添加到 2xx 成功响应中。如果您将https://new-website-shopify.myshopify.com/admin/customers/7094124372.json URL(无论真实主机名是什么)粘贴到浏览器地址栏中,会发生什么? 如果我在浏览器中粘贴带有真实主机名的“new-website-shopify.myshopify.com/admin/customers/70‌​94124372.json”,它会重定向回相同的域名,它会要求提供 api 凭据,然后显示响应正确。 你控制https://new-website-shopify.myshopify.com/admin/customers/?您可以对其进行配置更改吗?它运行什么服务器后端?您在这里遇到的问题似乎与***.com/questions/45557941/… 的答案中解释的相同。另请参阅***.com/questions/43871637/… 答案的如何避免 CORS 预检部分,了解一些可能的解决方法。 是的。我尝试了这些,但我没有找到适合我的情况的解决方案。我无法对其进行配置更改。这里的 url 是从 shopify 创建的。 如果您无法对该服务器进行配置更改,并且需要使用 Authorization 标头进行身份验证(包括用于 OPTIONS 请求),那么您将永远无法进行直接从浏览器中运行的前端 javascript 代码向它发出请求。没有什么魔法可以让这成为可能。相反,您需要从后端代码发出请求,并在那里处理响应。 【参考方案1】:

我会用这个答案为您省去一些麻烦。您不能从商店的前端调用 /admin,因为这会将您的访问令牌暴露给公众。相反,如果您想从前端访问 API,请使用 App Proxy 模式,允许您安全地进行 Ajax 调用以实现您的目标。

事实上,您几乎肯定会失败,而您获得的任何成功都会很快让您的商店陷入困境。就像被悲伤的熊猫取代,或者以其他方式被淘汰。

【讨论】:

【参考方案2】:
var cors = require('cors');
router.use(cors(
    origin: '*'
)); 
//var config = require('../config/config.json'); 
//testing /* GET home page. */ 
router.get('/', function (req, res, next) 
    res.setHeader("Content-Type", "application/liquid");
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.render('index', 
        title: 'Store Locator'
    );
);

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。

以上是关于Shopify API 跨域 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

web api 跨域请求,ajax跨域调用webapi

ajax 跨域请求

JQuery的Ajax跨域请求原理概述及实例

jQuery中Ajax+Spring MVC实现跨域请求

跨域 jQuery .AJAX 问题

JQuery的Ajax跨域请求的