2016-03-08 144 views
0

网络编程有点新奇,并且有点困惑。我有一个基本的快速node.js web服务器提供一个网站。我想,随手一个游戏ID的功能,并将它使用应使用以下REST API调用来支持他们的Web API抓住从蒸汽成绩信息:Steam API访问控制 - 允许来源问题

https://developer.valvesoftware.com/wiki/Steam_Web_API#GetGlobalAchievementPercentagesForApp_.28v0002.29

我有一个脚本文件正在担任了我试图在像这样的客户端文件中做请求。

function GetSteamGameAchievements(appid) 
{ 
    var request = new XMLHttpRequest(); 

    request.addEventListener('load',function(){ 

     console.log(JSON.stringify(this.responseText)); 

    }); 

    request.open("GET","http://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid="+ appid + "&format=json",true); 

    request.send(null); 
} 

我收到以下错误

的XMLHttpRequest无法加载 http://api.steampowered.com/ISteamUserStats/GetGlobalAchievementPercentagesForApp/v0002/?gameid=440&format=json。 请求的 资源上没有“Access-Control-Allow-Origin”标题。 'http://localhost:3000'因此不允许 访问。

我已经读了一些关于错误的信息,但似乎需要更改服务器端代码或其他东西。虽然所有的服务器端代码不喜欢的东西:

// Add headers 
app.use(function (req, res, next) { 

    // Website you wish to allow to connect 
    res.setHeader('Access-Control-Allow-Origin', 'http://api.steampowered.com'); 

    // Request methods you wish to allow 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 

    // Request headers you wish to allow 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); 

    // Set to true if you need the website to include cookies in the requests sent 
    // to the API (e.g. in case you use sessions) 
    res.setHeader('Access-Control-Allow-Credentials', true); 

    // Pass to next layer of middleware 
    next(); 
}); 

使用Open API天气这是唯一的其他第三方REST API,我的东西,如原代码的工作就可以了,所以我不确定为什么Steam API无法正常工作。使用邮递员我提交的查询字符串没有问题,但是当我在客户端JavaScript中执行此操作时,证券出现问题...但未打开天气API ...我不确定它为何适用于但不是其他。任何帮助将非常感激,我已经走过了一些类似的线程,但我认为我的无知使我很难理解我哪里出错,哪里需要修正。

回答

2

我读过一些有关的错误,但它似乎需要服务器端代码更改或东西。

是 - 由您要读取数据的服务。即通过蒸汽。

您不能允许自己使用访问者的浏览器从其他人的网站读取数据。

由于您无法更改Steam的服务器,因此您需要使用服务器而不是访问者的浏览器从Steam获取数据。

+0

所以只需要做一个获取请求到我的服务器,并重新调整请求的请求模块来调用蒸汽API然后回应我得到我的服务器的任何响应,然后将其发送到客户端? – user2927848

+0

@ user2927848 - 是的。 – Quentin

-2

你可以很容易'cors'模块。 使用此命令

npm install cors --save. 

,并在您的app.js添加这些行

var cors = require('cors');  
app.use(cors()); 

你并不需要得到你的代码dirty.This是一个更清洁的方式。

删除此

app.use(function (req, res, next) { 

    // Website you wish to allow to connect 
    res.setHeader('Access-Control-Allow-Origin', 'http://api.steampowered.com'); 

    // Request methods you wish to allow 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 

    // Request headers you wish to allow 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); 

    // Set to true if you need the website to include cookies in the requests sent 
    // to the API (e.g. in case you use sessions) 
    res.setHeader('Access-Control-Allow-Credentials', true); 

    // Pass to next layer of middleware 
    next(); 
}); 
+0

我已经包括它,我仍然得到错误,我必须以不同的方式格式化我的网址? – user2927848

+0

你如何在app.js中定义你的路线? –