使用POST和GET进行跨域请求的ReactJS失败,代码为405

时间:2018-02-04 10:44:22

标签: node.js reactjs rest cross-domain

我正在尝试向skyscanner发出交叉请求并获取一些信息。我研究了他们的doc,这就是我需要做的事情:

  1. 使用POST请求进行会话
  2. 然后获得响应标题,
  3. 然后使用该URL发出GET请求,
  4. 获取航班数据。
  5. 所以基本上有2个API调用。

    这是我的代码:

    export function getFlights() {
    
        const request = axios.post(
            'http://partners.api.skyscanner.net/apiservices/pricing/v1.0/',  
            JSON.stringify({
                "cabinclass": "Economy",
                "country": "UK",
                "currency": "GBP",
                .
                .
                .
                .
                "apikey": "apikey"
            }), 
            {   
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
            })
            .then(function (response) {
                console.log(response.headers);
                axios.get(response.headers.location + '?apiKey=apikey&stops=0&duration=360&includeCarriers=ba;u2;af').then(function(response) {
                    console.log(response)
                })
            })
            .catch(function (error) {
                console.log(error);
            });
        return {
            type: GET_FLIGHT, 
            payload: request
        };
    }
    

    所以我删除了一些查询参数并隐藏了api密钥。

    我已经下载了allow-control-allow-origin Chrome扩展程序,我还更改了主机文件:C:\Windows\System32\drivers\etc\hosts,所以现在我通过测试域访问我的应用程序:http://testdomain.com:3000/

    但是当我尝试获得结果时,我收到以下错误:

      

    POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0/ 405   (不允许的方法)

    当我转到NETWORK TAB并选择XHR时,我看到v1.0/ partners.api.skyscanner.net/apiservices/pricing是红色的,我可以看到headers下方:

      

    一般   响应标题   请求标题   表格数据,它(似乎)是一个带有我参数的航班??

    我不确定我做错了什么,但是从文档和其他一切似乎我应该得到代码200,这是为了成功,但我一直得到405.有人可以向我解释我做错了什么?

1 个答案:

答案 0 :(得分:2)

加载querystring库后试试这个:

var querystring = require('querystring');

var data = {
    cabinclass: 'Economy',
    country: 'UK',
    currency: 'GBP',
    // ...
    apikey: 'apikey' // be sure your API key is correct
};

var authOptions = {
    method: 'POST',
    url: 'http://partners.api.skyscanner.net/apiservices/pricing/v1.0',
    data: querystring.stringify(data),
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    json: true
};

axios(authOptions)
    .then(function(response){
        console.log(response.data);
        console.log(response.status);

        axios.get(response.headers.location + '?apiKey=apikey&stops=0&duration=360&includeCarriers=ba;u2;af').then(function(response) {
            console.log(response);
        });
    })
    .catch(function(error){
      console.log(error);
    });

根据doc,尝试使用http://partners.api.skyscanner.net/apiservices/pricing/v1.0代替http://partners.api.skyscanner.net/apiservices/pricing/v1.0/(不使用 / )。