尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误

Posted

技术标签:

【中文标题】尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误【英文标题】:Trying to make a JSON POST request to the TVDB REST API at https://api.thetvdb.com/, but getting CORS error 【发布时间】:2016-10-31 12:40:40 【问题描述】:

我正在使用 AngularJS 将应用程序从 Django 移植到纯 html5/CSS,并且在向 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 请求库遇到这个问题,例如(我使用这个 python 库从运行 angular JS 的同一台机器触发对 tvDB 的请求应用程序完全没有问题)我想知道 AngularJS 中是否没有方法或不同的指令来阻止它设置 CORS 标头。

TheTVDB 不会将 CORS 添加到他们的服务器,因为他们的大多数用户都在运行 Laravel (php)、Java 和 Django(Python) 应用程序并且正在使用他们的服务而没有此类 CORS 问题。

非常感谢您的帮助。

谢谢你, 最好的祝福 TS

【问题讨论】:

在python中创建代理 出于架构原因,我想避免这种情况。但这是否意味着当服务器不提供 CORS 支持时我会受到 AngularJS 的限制? 不,这意味着您受到浏览器安全性的限制。除了使用第三方代理,您别无选择 你的api从body接收数据?还是通过参数?,也不是在标题中重复使用 dataType 吗? @PauloGaldoSandoval 我会从服务器收到一个带有令牌信息的 json,以便我继续处理其他请求。 dataType 可能是多余的,但我想它在这里没有影响。 【参考方案1】:

你可以看这里:https://forums.thetvdb.com/viewtopic.php?t=9125

TVdb 不提供任何 cors 标头,这意味着您无法直接通过 javascript 访问 API。但是,正如@Matt West 所说,cors 策略仅适用于浏览器。 快速解决方案:创建一个 python 程序作为代理,将所有 AJAX 请求重定向到 TVdb。

【讨论】:

【参考方案2】:

您的 Python 请求有效,因为它来自您的服务器或本地计算机,而 same origin policy 仅适用于浏览器内。

您最好的答案是使用服务器端脚本。让您的客户端 POST 请求转到服务器上的控制器或端点,然后触发服务器脚本。假设 API 有一些返回数据,您会将其添加到服务器的响应中,然后将其发送到客户端。

【讨论】:

我的 python 请求是从本地主机(我的机器)到api.thetvdb.com 触发的,所以不是来自服务器。我无法访问服务器,所以我必须有一个 python 层与我的 angularJs 位于同一侧,只是为了中间这些请求,根据这个线程上的其他 cmets 和建议,我想尽可能避免尽可能。 对不起,我想我的回答有点混乱。在这种情况下,当我说“服务器”时,我指的是您的本地机器,或者您托管后端代码的任何地方。 API 将是您无法控制的服务器。这是假设您在某处托管后端代码。如果此程序仅适用于客户端,并且 API 不符合 CORS,那么您将不得不执行 POST 操作。【参考方案3】:

使用 JSONP 请求。这样你就可以避开 CORS。

编辑:抱歉,您使用的是 POST,这仅适用于获取请求。

您可以创建一个代理来接收请求,然后进行 CURL POST。没有服务器端“CORS”,所以你会没事的。

【讨论】:

不能只说使用 jsonp 就好像它是所有 CORS 的神奇修复。 API 必须支持它 实际上我不能使用 JSONP,因为我实际上是在发出 POST 请求,而且我知道 JSONP 仅用于 GET,对吧?

以上是关于尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试在java中的socket客户端程序中捕获多次尝试

Break 在有资源的尝试中不起作用,但在没有资源的尝试中起作用

尝试连接时“尝试在不是套接字的东西上进行操作”

尝试在 Swift 3 中保存自定义对象时尝试插入非属性列表对象

在 Flutter 中限制登录尝试?

尝试在批处理环境中执行 REXX 或 TSO 命令时尝试绕过错误