大话前端让前端飞程序员

微信小程序访问豆瓣api403问题

2018-05-08  本文已影响79人  fenerchen

通过豆瓣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
  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解决方法

上一篇下一篇

猜你喜欢

热点阅读