微信小程序访问豆瓣api403问题
通过豆瓣api可以获取很多电影、书籍等的数据信息。昨晚上用微信小程序请求豆瓣api,竟然被豆瓣拒绝了。(豆瓣设置了小程序的访问权限)。
问题
小程序请求是这样子:
onLoad: function (options) {
this.getMoviesData('https://api.douban.com/v2/book/1220562')
},
getMoviesData:function(url){
wx.request({
url: url,
data: {},
method: 'GET',
header: { 'content-type': 'application/json' },
success: function (res) {
console.log(res)
},
fail: function () {
console.log('fail')
},
})
}
错误这样子
解决
1、使用Nginx
- 首先下载Nginx
- 解压
- 打开解压文件nginx-1.13.12(这是你的解压文件名)/conf/nginx.conf
- 在文件中找到server {},在server {}下添加
location /v2/ {
proxy_store off;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Referer 'no-referrer-when-downgrade';
proxy_set_header User-Agent 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36';
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_pass https://api.douban.com/v2/;
}
重点是更改
proxy_set_header Referer 'no-referrer-when-downgrade';
proxy_set_header User-Agent 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36';
以此来代替小程序去请求豆瓣,然后把数据返回给小程序。
更改配置后保存,在nginx.exe
文件夹下打开命令窗口,输入start nginx
,启动后每次修改配置,使用nginx -s reload
重启
常用的指令:
start nginx : 启动nginx
nginx -s reload :修改配置后重新加载生效
nginx -s reopen :重新打开日志文件
nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确
关闭nginx:
nginx -s stop :快速停止nginx
nginx -s quit :完整有序的停止nginx
注意,我是在windows下进行开发和配置
如何使用:只需把请求的url的协议和域名替换成http://localhost/v2/
,例如https://api.douban.com/v2/book/1220562
=》http://localhost/v2/book/1220562
测试
onLoad: function (options) {
this.getMoviesData('http://localhost/v2/book/1220562')
},
getMoviesData:function(url){
wx.request({
url: url,
data: {},
method: 'GET',
header: { 'content-type': 'application/json' },
success: function (res) {
console.log(res)
},
fail: function () {
console.log('fail')
},
})
}
竟然还是错误!!!
状态码4xx客户端错误,400Bad Request 意思是我们发送了一个错误的请求。经过尝试发现,把header请求改成 header: { 'content-type': 'application/xml' }就可以了。额。。。明明获取的数据就是json,。。。可能是小程序后台对header做了限制。
终于等到你(正确测试)
onLoad: function (options) {
this.getMoviesData('http://localhost/v2/book/1220562')
},
getMoviesData:function(url){
wx.request({
url: url,
data: {},
method: 'GET',
header: { 'content-type': 'application/xml' },
success: function (res) {
console.log(res)
},
fail: function () {
console.log('fail')
},
})
}
2、使用node自己搭建代理
搭建本地服务器,监听8000端口,在服务器内部调用http.get请求豆瓣数据,将获取到的数据返回给浏览器。
node.js代码
var url=require('url');
var http = require('http');
var server = http.createServer((request, response) => {
//获取要访问的路径
var pathname=url.parse(request.url).pathname;
//生成整个访问链接
var requrl='http://api.douban.com'+pathname;
//缓存数据
var body = [];
response.writeHead(200, { 'Content-Type': 'application/json' });
//发起代理请求
http.get(requrl, function (res) {
res.on('data', (chunk) => {
body.push(chunk)
});
res.on('end', () => {
body = Buffer.concat(body);
//请求回来的数据写入浏览器
response.end(body.toString())
})
});
})
server.listen(8000)
微信小程序发起请求
wx.request({
url: 'http://localhost:8000/v2/movie/in_theaters',
// url: 'http://localhost:8000',
method: 'GET',
header: { 'content-type': 'application/xml' },
success: function (res) {
console.log(res)
}
})
打印数据输出到微信开发者工具的控制台:
微信请求本地端口,本地端口的数据是从豆瓣获取的,代理相当于起了'中间商'的作用。缺点是,只能本地获取,外界无法获取。除非把node放在真正的服务器上。
3、使用https://douban.uieee.com
https://douban.uieee.com
是某大佬搭建的代理,
https://api.douban.com/v2/book/1220562
=》https://douban.uieee.com/v2/book/1220562
参考资料:
saysmy
小程序请求豆瓣API报403解决方法