如何在fetch / axios跨站点请求上使用JSONP

时间:2017-04-18 11:48:11

标签: jquery ajax fetch axios

我试图在维基百科API上执行GET请求。使用jQuery如下工作正常:

$.ajax({
  url: 'https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrnamespace=0&gsrlimit=10&prop=pageimages|extracts&pilimit=max&exintro&explaintext&exsentences=1&exlimit=max&gsrsearch=Test&callback=JSON_CALLBACK',
  type: 'GET',
  headers: {'X-Requested-With': 'XMLHttpRequest'},
  crossDomain: true,
  dataType: 'jsonp'
}).done(function(data) {
  console.log("Data: ", data);  
});

但是我想使用fetch或axios api,它在飞行前停止,并带有请求方法: OPTIONS 。为什么它适用于jQuery而不适用于其他API?

axios.get('https://en.wikipedia.org/w/api.php?format=json&action=query&generator=search&gsrnamespace=0&gsrlimit=10&prop=pageimages|extracts&pilimit=max&exintro&explaintext&exsentences=1&exlimit=max&gsrsearch=Test&callback=JSON_CALLBACK', 
    { headers: {'X-Requested-With': 'XMLHttpRequest',
                'content-type': 'text/plain'}
    })
    .then(function (response) {
        console.log("Response: ", response);  
    });

我看到它可能与GET请求的Content-Type有关,在jQuery上默认似乎是 text / plain ,但是我在尝试时没有成功更改以 text / html 发送的fetch / axios请求的内容类型。

关于可能出现什么问题的任何想法?

4 个答案:

答案 0 :(得分:9)

我发现问题与请求的内容类型无关。

问题是由于API(fetch和axios)不支持 jsonp 请求。使用 jsonp os对我来说不够清楚,我可以在这里找到一个很好的解释:https://stackoverflow.com/a/6879276/4051961

虽然他们不支持,但他们提供了执行 jsonp 请求的替代方案:

axios:https://github.com/mzabriskie/axios/blob/master/COOKBOOK.md#jsonp
获取:https://www.npmjs.com/package/fetch-jsonp

答案 1 :(得分:8)

使用axios访问JSONP的推荐方法实际上是不使用axios:

  1. The Discussion on Why (not)
  2. A similar question

  3. Alternative Suggestion from Axios

  4. 简而言之:

    npm install jsonp --save
    

    使用它:

    var jsonp = require('jsonp');
    
    jsonp('http://www.example.com/foo', null, function (err, data) {
      if (err) {
        console.error(err.message);
      } else {
        console.log(data);
      }
    });
    

答案 2 :(得分:2)

在React应用程序中遇到问题

Axios不支持JSONP,它们提供了执行JSONp请求的替代方法:

点击此链接以查看有关axios的jsonp的一些文档: axios:https://github.com/mzabriskie/axios/blob/master/COOKBOOK.md#jsonp

这是我的文档:

步骤1:$ npm install jsonp --save

第2步:

import jsonp from 'jsonp';

(位于组件顶部)

第3步:在React组件中创建一个方法:

JSONP () {
        jsonp( "https://*YourUrlHere.jsonp", { name: 'Name Of JSONP Callback Function' }, (error, data) => {
            if (error) {
                this.setState({
                    error,
                });
            } else {
                this.setState({
                    data: data,
                });
            }
        });
    }

答案 3 :(得分:0)

yarn add simple-jsonp-promisenpm install simple-jsonp-promise

import jsonp from 'simple-jsonp-promise'

async function Test () {
  const url = 'http://...'
  const params = {param1: 1, param2: 2}

  const response = await jsonp(url, {data: params})
  console.log('response:', response)
}