当前位置: 首页 > 面试题库 >

jQuery AJAX调用导致错误状态403

支淮晨
2023-03-14
问题内容

我正在使用jQuery AJAX对Web服务进行查询。我的查询如下所示:

var serviceEndpoint = 'http://example.com/object/details?version=1.1';
$.ajax({
  type: 'GET', 
  url: serviceEndpoint,
  dataType: 'jsonp',
  contentType: 'jsonp',
  headers: { 'api-key':'myKey' },
  success: onSuccess,
  error: onFailure
});

执行此操作时,我收到状态错误403。我不明白为什么我的通话导致状态代码为403。我控制着服务的安全性,并将其标记为完全开放。我知道密钥是有效的,因为我在另一个可以使用的电话中使用了它。这是有效的呼叫:

var endpoint = 'http://example.com/object/data/item?version=1.1';
$.ajax({ 
  type: 'POST', 
  url: endpoint, 
  cache: 'false',
  contentType:'application/json',
  headers: {
    'api-key':'myKey',
    'Content-Type':'application/json'
  },
  data: JSON.stringify({
    id: 5,
    count:true
  }),
  success: onDataSuccess,
  error: onDataFailure
});

我知道这是两个不同的端点。但是我100%确信这不是服务器端身份验证或权限错误。再一次,一切在服务器端都是开放的。这意味着我在客户端请求中犯了一些错误。

我觉得我应该在开发过程中提出这个要求。因此,我正在从http://
localhost:3000
运行它。因此,我立即认为这是CORS问题。但是一切看起来都是正确的。我的POST请求有效,但我的GET并没有使我感到非常沮丧。我想念什么吗?会是什么呢?


问题答案:

403错误的原因是 您没有发送标头 。由于正在发出CORS请求,因此除非服务器通过添加Access-Control-Allow- Headers到响应中来启用这些标头,否则无法发送任何自定义标头。

在preflighted-request中,客户端向服务器发出2个请求。第一个是预检(使用OPTIONS方法),第二个是实际请求。服务器发送Access-
Control-Allow-Headers
标头作为预检请求的响应。因此,它允许发送一些标头。通过这种方式,您的POST请求可以工作,因为POST请求是预检请求。但是对于GET请求,没有预检收集Access-
Control-Allow-Headers
头,并且在这种情况下浏览器不会发送您的自定义头。

解决此问题的方法:

解决方法是,将dataTypecontentType设置json为以下值:

var serviceEndpoint = 'http://example.com/object/details?version=1.1';
$.ajax({
  type: 'GET', 
  url: serviceEndpoint,
  dataType: 'json',
  contentType: 'json',
  headers: { 'api-key':'myKey' },
  success: onSuccess,
  error: onFailure
});

这样,您的get请求将为preflighted request。如果您的服务器启用api-key带有Access-Control-Allow-
Headers标头,则它将起作用。

以上请求的服务器配置示例(用express.js编写):

res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', '*');
res.setHeader('Access-Control-Allow-Headers', 'api-key,content-type');
res.setHeader('Access-Control-Allow-Credentials', true);

添加:

实际上,contentType应该是application/javascript或者application/json在执行jsonp请求时。没有contentType作为jsonp



 类似资料:
  • 通过遍历CSVReader类,我发现了一个定义的自定义异常,该异常与我得到的异常完全相同。但我认为当在某个double qoute(CSV文件的单元格值)中发现一个双引号时,它就会出现。我将该链接称为:https://github.com/mulesoft/salesforce-connector/blob/master/src/main/java/com/sforce/async/csvread

  • 使用Kubernetes 1.12.6-gke。7或更高版本可以创建ManagedCertificate,然后从向Internet公开服务的入口资源引用该证书。 运行kubectl描述管理证书证书名称首先指示证书处于配置状态,但最终转到FailedNotViable。 尽管使用静态IP和DNS可以很好地解析上述服务的http版本,但所有ManagedCertificate最终都会处于“状态:Fai

  • 问题内容: 由于某些原因,我的fx:id无法正确绑定到我的类,因此始终会导致错误。 控制者 XML文件 我认为我了解问题的根源,但不了解如何正确解决。根据这个问题的答案,我认为我正在尝试在调用构造函数之前分配FXML元素(并且这些元素只能在初始化期间/之后分配)。 有没有办法 不 执行此操作?还是我犯了一个完全不同的错误? 问题答案: 您使用进口 在您的fxml文件中。 因此,在加载fxml文件时

  • 启用proguard规则后,我在向网络发送任何内容之前遇到以下错误。 java.lang.RuntimeException:无法将FormDocTankPermission转换为RequestBody 引起的 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类FormDocTankPermission的序列化程序,也

  • 我想我明白我的问题的根源,但我不明白如何正确地解决它。根据这个问题的答案,我认为我试图在调用构造函数之前分配FXML元素(这些元素只能在初始化期间/之后分配)。 有没有一种方法可以在不实现的情况下做到这一点?还是我犯了一个完全不同的错误?

  • 我试图初始化CoProcessFunction中的“ListState”,但它不断抛出这个错误“java.lang.NullPointerException:Keyed state只能用于'Keyed stream'”“。 这是我用的密码 引发此错误的行是 错误日志跟踪的其余部分如下所示