尝试向https://api.thetvdb.com/的TVDB REST API进行JSON POST请求,但是出现了CORS错误。

3
我正在将一个应用从Django迁移到纯HTML5/CSS和AngularJS,但在向TheTVDB REST API服务器(https://api.thetvdb.com/)进行JSON POST请求时遇到问题。

API调用是在AngularJS的服务中完成的:

return {
    login: function(){
        return $http({
            method: 'POST',
            dataType: 'json',
            headers: {'Content-Type': 'application/json'},
            data: {'apikey':apiKey, 'username': username, 'userkey': identifier},
            url: tvdbAuthURL
        })
    }
}

然后我遇到了这个错误:

XMLHttpRequest cannot load https://api.thetvdb.com/login/. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. The response had HTTP status code 401.

我尝试避免预检请求,但没有成功。由于我在使用Python的requests库时没有遇到这个问题(例如,我从运行AngularJS应用程序的同一台机器触发对tvDB的请求时完全没有问题),我想知道是否有一种方法或不同的指令在AngularJS中防止设置CORS标头。
TheTVDB不会将CORS添加到其服务器上,因为他们的大多数用户正在运行Laravel(PHP)、Java和Django(Python)应用程序,并且使用它们的服务没有这样的CORS问题。
非常感谢您的帮助。
谢谢, 最好的问候 TS

1
在Python中创建代理 - charlietfl
不,这意味着您受到浏览器安全限制的限制。除了使用第三方代理之外,您别无选择。 - charlietfl
你的 API 是通过请求体还是参数接收数据?另外,在头部使用 dataType 是否有些冗余? - Paulo Galdo Sandoval
@PauloGaldoSandoval 我将从服务器接收一个包含令牌信息的json,以便我可以进行其他请求。dataType可能是冗余的,但在这里没有影响,我想。 - T.S.
一些答案可能在这里:https://dev59.com/FWgv5IYBdhLWcg3wY_42除了代理之外,还有一种不在此处建议的方法是将远程服务器嵌入iframe中,并通过片段或window.name进行通信,请查看http://www.ibm.com/developerworks/library/wa-crossdomaincomm/#N10120 - applecrusher
显示剩余2条评论
3个回答

1
你的Python请求有效是因为它来自于你的服务器或本地机器,而同源策略仅适用于浏览器内部。
最好的解决方案是使用服务器端脚本。让你的客户端POST请求发送到服务器上的控制器或端点,然后触发服务器脚本。假设API返回了一些数据,你需要将其添加到服务器的响应中,然后发送给客户端。

我的Python请求是从本地主机触发的,发送到https://api.thetvdb.com/,因此不是从服务器发送的。我无法访问服务器,因此必须在与我的AngularJS相同的侧面上放置一个Python层来中介这些请求,根据该线程中的其他评论和建议,我尽可能想避免这种情况。 - T.S.
抱歉,我想我的回答有点混乱。在这种情况下,当我说“服务器”时,我指的是您的本地计算机或您托管后端代码的任何位置。 API 将是您无法控制的服务器。这是假设您确实在某个地方托管了后端代码。如果此程序仅为客户端,并且 API 不符合 CORS 标准,则在 POST 操作上会出现问题。 - Matt West

1
你可以在这里查看: https://forums.thetvdb.com/viewtopic.php?t=9125 TVdb没有提供任何cors头,这意味着你无法直接通过Javascript访问API。但是,正如@Matt West所说,cors策略只适用于浏览器。 快速解决方案:创建一个Python程序作为代理,将所有AJAX请求重定向到TVdb。

0
使用JSONP请求。这样你就可以避开CORS。
编辑:抱歉,你正在使用POST,这只适用于get请求。
您可以创建一个代理接收请求,然后进行CURL POST。没有服务器端的“CORS”,所以你会没问题的。

1
不能仅仅说使用jsonp就像魔法一样修复所有CORS问题。API必须支持它。 - charlietfl
1
实际上我不能使用JSONP,因为我正在发出一个POST请求,而我了解JSONP仅适用于GET请求,对吗? - T.S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接