美文网首页大话前端让前端飞程序员
微信小程序访问豆瓣api403问题

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

作者: fenerchen | 来源:发表于2018-05-08 11:39 被阅读79次

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

    相关文章

      网友评论

        本文标题:微信小程序访问豆瓣api403问题

        本文链接:https://www.haomeiwen.com/subject/nrhirftx.html