首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Wikipedia API +跨源请求

Wikipedia API +跨源请求
EN

Stack Overflow用户
提问于 2014-05-30 02:08:30
回答 5查看 21.8K关注 0票数 30

我试图使用JavaScript和CORS访问维基百科。

据我所知,维基百科应该支持CORS:请求

我尝试了以下脚本:创建一个XMLHttpRequest+凭证/XDomainRequest,添加一些HTTP头(“访问控制-允许-凭据”,等等)。然后发送查询。

http://jsfiddle.net/lindenb/Vr7RS/

代码语言:javascript
运行
AI代码解释
复制
var WikipediaCORS=
    {
        setMessage:function(msg)
        {
            var span=document.getElementById("id1");
            span.appendChild(document.createTextNode(msg));
        },
        // Create the XHR object.
        createCORSRequest:function(url)
        {
            var xhr = new XMLHttpRequest();

            if ("withCredentials" in xhr)
            {
                xhr.open("GET", url, true);
            }
            else if (typeof XDomainRequest != "undefined")
            {
                xhr = new XDomainRequest();
                xhr.open(method, url);
            }
            else
            {
                return null;
            }
            xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");
            xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
            return xhr;
        },
        init:function()
        {
            var _this = this;
            var url = 'http://en.wikipedia.org/w/api.php?action=opensearch&search=Javascript&format=json';
            var xhr = this.createCORSRequest(url);
            if (!xhr)
            {
                this.setMessage('CORS not supported');
                return;
            }

            xhr.onload = function()
            {
                _this.setMessage(xhr.responseText);
            };
            xhr.onerror = function()
            {
                _this.setMessage('Woops, there was an error making the request.');
            };
            xhr.send();
        }
    };

但是我的脚本失败了(调用“xhr.onerror”)。我怎么才能修好它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-30 02:22:16

CORS标头被发送以允许请求脚本访问内容。

维基百科是派来的不是你。

根据评论:

维基百科是一般规则的一个例外,它要求您将origin参数附加到您请求的URL中。

我认为这背后的原因与缓存有关。我不知道他们使用的是哪种机制,但这可能会使他们更容易更好地存储缓存对象并以这种方式构建变体。

有关CORS的更多信息,请参阅MediaWiki API文档:

CORS API还要求将源作为请求参数提供,该参数名为“MediaWiki”,与CORS协议所需的源标头匹配。请注意,这个头必须包含在任何飞行前请求中,因此即使对于POST请求,也应该包括在请求URI的查询字符串部分中。 如果CORS原始检查通过,MediaWiki将在响应中包含访问控制允许凭据: true标头,因此可以发送身份验证cookie。

这意味着你必须发送一个Origin头来告诉维基百科你来自哪里。维基百科是在管理访问,而不是你。

发送此源标头:

代码语言:javascript
运行
AI代码解释
复制
xhr.setRequestHeader("Origin", "http://www.yourpage.com");

Access-Control-Allow-*头是响应头,而不是请求头。

此外,维基百科还需要内容类型json。

代码语言:javascript
运行
AI代码解释
复制
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
票数 13
EN

Stack Overflow用户

发布于 2016-08-12 07:20:19

我在做一个freeCodeCamp项目时也遇到了同样的问题,解决方案太简单了,我笑了,因为我花了几个小时来寻找它。在您的jQuery URL中包括下面的参数。

&origin=*

工作CodePen

代码语言:javascript
运行
AI代码解释
复制
$.getJSON(
  'https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=15&generator=search' +
  '&origin=*' + // <-- this is the magic ingredient!
  '&gsrsearch='q, function(data){ /* ... */ }
);
票数 118
EN

Stack Overflow用户

发布于 2016-08-07 09:22:13

截至2016年8月,Wikipedia通过使用普通的Ajax请求(不需要JSONP/回调操作)支持CORS请求。这可以通过在API调用中设置原点来实现。

对于经过身份验证的请求,这必须与Origin中的“源”之一完全匹配(您需要在执行Ajax调用时使用beforeSend属性来设置这个值)。

对于未经身份验证的请求,您可以简单地将其设置为星号(*),并且它在使用来自域的简单$.getJSON时工作。

示例API调用:

https://en.wikipedia.org//w/api.php?action=opensearch&format=json&origin=*&search=stack&limit=10

更多是在MediaWiki API沙箱:MediaWiki API沙箱

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23952045

复制
相关文章
Django小技巧15: 使用基于类视图的Mixins
依类似的方式, 你可以在UpdateView中, 重用相同的FormMessageMixin, 并覆盖默认的form_invalid_message方法.
用户1416054
2018/12/06
1.1K0
Django小技巧15: 使用基于类视图的Mixins
Django装饰器的使用 (类视图)
为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。
kirin
2021/02/04
1.1K0
django的类视图-11
使用函数方式定义的视图叫函数视图,虽然使用方便,便于理解,但是当一个s视图有多种请求方式的时候,变需要使用分支来编写不同请求方式对应的逻辑。
py3study
2020/01/19
7850
Django 中针对基于类的视图添加 csrf_exempt
在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问。那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一:在类的 dispatch 方法上使用 @csrf_exempt from django.views.decorators.csrf import csrf_exempt class MyView(View): def get(self, request): return HttpResponse("
kongxx
2018/05/14
1.6K0
Django之基于iframe的ajax
那么伪造ajax的方式即为将向服务端发送请求返回的数据返回到iframe中,再使用js从iframe中的文档中取出数据使用。
py3study
2020/01/21
1.1K0
Django 2.1.7 类视图
Django 2.1.7 创建应用模板 Django 2.1.7 配置公共静态文件、公共模板路径 Django 2.1.7 模板语言 - 变量、标签、过滤器、自定义过滤器、模板注释 Django 2.1.7 模板继承 Django 2.1.7 模板 - HTML转义 Django 2.1.7 模板 - CSRF 跨站请求伪造 Django 2.1.7 模板 - 图片验证码的实现 Django 2.1.7 模板 - 动态URL 反向解析 Django 2.1.7 模板 - 动态配置静态文件路径
Devops海洋的渔夫
2019/07/15
7010
Django 2.1.7 类视图
Django 官方推荐的姿势:类视图
在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑是一样的。比如一个博客和一个论坛,通常其首页都是展示一系列的文章列表或者帖子列表。对处理首页的视图函数来说,虽然其处理的对象一个是文章,另一个是帖子,但是其处理的过程是非常类似的:首先是从数据库取出文章或者帖子列表,然后将这些数据传递给模板并渲染模板。于是,django 把这些相同的逻辑代码抽取了出来,写成了一系列的通用视图函数,即基于类的通用视图(Generic Class Based View)。
HelloGitHub
2021/05/14
1.3K0
django 入门:通用视图类重构视图
博客:https://www.jianshu.com/p/8cdf099e974f
陈宇明
2020/12/15
9080
django 入门:通用视图类重构视图
Django(57)Generic类视图[通俗易懂]
上篇我们通过mixin可以非常方便的实现一些CURD操作。实际上针对这些mixin,DRF还进一步的进行了封装,放到generics下。有以下generic类视图:
全栈程序员站长
2022/09/19
5190
Django内置的通用类视图及实例
表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性:
菲宇
2019/06/13
3K0
Django内置的通用类视图及实例
django--ajax的使用,应用
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)
测试开发社区
2019/09/20
8300
django--ajax的使用,应用
django--ajax的使用,应用
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)
py3study
2018/08/03
1.1K0
django 1.8 官方文档翻译: 3-4-1 基于类的视图
视图是一个可调用对象,它接收一个请求然后返回一个响应。这个可调用对象可以不只是函数,Django 提供一些可以用作视图的类。它们允许你结构化你的视图并且利用继承和混合重用代码。后面我们将介绍一些用于简单任务的通用视图,但你可能想要设计自己的可重用视图的结构以适合你的使用场景。完整的细节,请参见基于类的视图的参考文档。
ApacheCN_飞龙
2022/11/27
8830
Django REST Framework-常用的类视图
Django REST Framework是基于Django的一个用于构建Web API的框架。它提供了许多用于构建Web API的工具和实用程序,其中最常用的是类视图。类视图是一种Django REST Framework的API视图,它是基于类的视图。它提供了一种方便的方式来编写可重用的Web API视图,并带有许多有用的内置功能。
玖叁叁
2023/04/24
7200
django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
你自己实现这些功能经常导致许多重复的样本代码(参见在视图中使用表单)。为了避免这点,Django 提供一系列的通用的基于类的视图用于表单的处理。
ApacheCN_飞龙
2022/11/27
1.9K0
python测试开发django-62.基于类的视图(APIView和View)
django中编辑视图views.py有两种方式,一种是基于类的实现,另外一种是函数式的实现方式,两种方法都可以用。 REST框架提供了一个APIView类,它是Django View类的子类。
上海-悠悠
2019/09/16
1.5K0
python测试开发django-62.基于类的视图(APIView和View)
Django-DRF | GenericAPIView 视图类
Django REST框架构建Web API。Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2020/01/16
1.2K0
Django-DRF | GenericAPIView 视图类
利用Django通用类视图(class
最近在学习Django,官方文档介绍地十分详细。但是“大而全”就难免会有些不够速成,和我们这个浮躁的互联网时代格格不入,所以我就整理了这个文档。就像coolshell说的,一泡屎的时间就可以看完。
py3study
2020/01/03
1.5K0
35. Django 2.1.7 类视图
1) 首先在应用的view.py中创建两个视图test_method和test_method_handle
Devops海洋的渔夫
2022/01/17
2950
35. Django 2.1.7 类视图
点击加载更多

相似问题

使用基于类的视图和ajax的Django应用程序?

30

用于处理AJAX响应的基于django类的视图

11

使用基于Django类的视图处理AJAX时遇到问题

10

基于Django类的视图

30

基于类的视图Django

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档