jQuery AJAX call results in error status 403

前端 未结 2 940
栀梦
栀梦 2020-12-08 23:18

I\'m making a query to a web service using jQuery AJAX. My query looks like this:

var serviceEndpoint = \'http://example.com/object/details?version=1.1\';
$.         


        
2条回答
  •  生来不讨喜
    2020-12-08 23:37

    The reason of 403 error is you are not sending headers. Since you are making a CORS request, you cannot send any custom headers unless server enables these header by adding Access-Control-Allow-Headers to the response.

    In a preflighted-request, client makes 2 requests to the server. First one is preflight (with OPTIONS method) and the second one is the real request. The server sends Access-Control-Allow-Headers header as a response of the preflight request. So it enables some headers to be sent. By this way your POST request can work because the POST request is a preflight-request. But for a GET request, there is no preflight to gather Access-Control-Allow-Headers header and browser doesn't send your custom headers in this case.

    A workaround for this issue:

    As a workaround, set your dataType and contentType to json as the following:

    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
    });
    

    By this way, your get request will be a preflighted request. If your server enables the api-key with Access-Control-Allow-Headers header, it will work.

    Sample server configuration for the above request (written in 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);
    

    ADDED:

    Actually, contentType should be either application/javascript or application/json while doing a jsonp request. There is no contentType as jsonp.

提交回复
热议问题