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

Lua*_*ler 8 ajax jquery 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);  
});
Run Code Online (Sandbox Code Playgroud)

但是我想使用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);  
    });
Run Code Online (Sandbox Code Playgroud)

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

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

Lua*_*ler 13

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

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

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

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


Dom*_*rer 9

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

  1. 讨论为什么(不是)
  2. 一个类似的问题

  3. Axios的替代建议

简而言之:

npm install jsonp --save
Run Code Online (Sandbox Code Playgroud)

使用它像:

var jsonp = require('jsonp');

jsonp('http://www.example.com/foo', null, function (err, data) {
  if (err) {
    console.error(err.message);
  } else {
    console.log(data);
  }
});
Run Code Online (Sandbox Code Playgroud)


小智 5

在 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';
Run Code Online (Sandbox Code Playgroud)

(这位于组件的顶部)

第 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,
                });
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)