收藏
回答

小程序 Request报错401 Unauthorized错误

问题模块
API和组件

新建一个默认的小程序,使用真实的AppID,在app.js的wx.login中添加向后台请求的代码,报告401 Unauthorized错误。代码如下图:

程序运行输出结果如下图:


最后一次编辑于  2017-11-24  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

26 个回答

  • 薛磊啊
    薛磊啊
    2018-02-08

    谢谢 风淡云清! ,已解决这个问题,是我接口的问题。

    2018-02-08
    赞同
    回复
  • 云淡风轻
    云淡风轻
    2018-02-07

    薛磊啊! 时间老长了,我都快忘了,刚又从头捋了一遍,什么意思你再说说,什么环境,后台什么框架!


    2018-02-07
    赞同
    回复
  • 薛磊啊
    薛磊啊
    2018-02-07

    各位大神!如果是这个错误呢?



    下面这个data打开是这样的


    2018-02-07
    赞同
    回复
  • 云淡风轻
    云淡风轻
    2017-11-28

    再有,你的iis的安全配置要允许匿名登录

    2017-11-28
    赞同
    回复
  • 云淡风轻
    云淡风轻
    2017-11-28

    有application/string这个说法吗?换x-www-form-urlencoded试试:比如这个是我在项目中用的,后台thinkphp框架,亲测是能用的,你可以参照着改改用用看

    var requestUrl = function (option, cb) {
        option = option || {}
        option.url = url + option.action
        option.data = option.json ? { wx_param: JSON.stringify(option.param) } : option.param,
        option.method = option.method || 'POST'
        option.navigationLoading = option.navigationLoading === false?false:true
        option.header = option.header || {}
        if (!option.header['content-type']) {
            option.header['content-type'] = 'application/x-www-form-urlencoded'
        }
        option.header['X-Requested-With'] = 'XMLHttpRequest'
        option.dataType = option.dataType || 'json'
     
        var session = wx.getStorageSync('session');
        var ts = Date.parse(new Date) / 1000
         
        if (session && session.id && session.expire > ts) {
            option.header.Cookie = 'PHPSESSID=' + session.id
        }
        else {
            if (option.action != 'User/login') {
                !option.navigationLoading && wx.showNavigationBarLoading()
                _login(ssid => {
                    option.header.Cookie = 'PHPSESSID=' + ssid
                    option.complete = function(rlt2){
                        !option.navigationLoading && wx.hideNavigationBarLoading()
                        if (!_showErr(rlt2.data)) {
                            cb && cb(rlt2.data)
                        }
                    }
                    wx.request(option)
                })
                return
            }
        }
        !option.navigationLoading && wx.showNavigationBarLoading()
        option.complete = function (rlt2) {
            !option.navigationLoading && wx.hideNavigationBarLoading()
            if (rlt2.data.status == -200) {
                _login(ssid=>{
                    option.header.Cookie = 'PHPSESSID=' + ssid
                    option.complete = function(rlt3) {
                        !option.navigationLoading && wx.hideNavigationBarLoading()
                        if (!_showErr(rlt3.data)) {
                            cb && cb(rlt3.data)
                        }
                    }
                    wx.request(option)
                })
            }
            else {
                if (!_showErr(rlt2.data)) {
                    cb && cb(rlt2.data)
                }
            }
     
        }
        wx.request(option)
    }


    2017-11-28
    赞同
    回复
  • 陈炎平
    陈炎平
    2017-11-28

     To 风淡云轻:

    现在的情况是这样的:

    1、浏览器里面输入服务接口,能正常返回了。无论内网、还是外网,甚至手机上,都可以的。如下图:


    2、小程序开发工具中,调用服务接口,还是报告错误。根据你的提示,分别用json和string传参数,报告的错误不一样:json时报告401错误,string时报告500错误。分别如下图:

    图一:json


    图二:string

    昨天找错误原因时,发现443端口没开。开了后还是不同,后来同事修改了服务器系统的temp文件夹的权限,增加了IIS-User用户的写入权限,在浏览器中直接输入服务接口就通了,就变成上面的情况了。

    我估计,是不是域名的权限设置、或者服务器的权限设置有问题。

    PS:目前的服务器是虚拟机上运行的。


    麻烦风淡云轻及各位再帮给看看,项目要验收了,心里真着急啊。

    2017-11-28
    赞同
    回复 1
    • Sonder
      Sonder
      07-03

      大神,想问一下你所详述的这个问题后来是怎么解决的?目前遇到的情况和你详述的几乎一致。

      07-03
      回复
  • 云淡风轻
    云淡风轻
    2017-11-28

    还有一点,在php环境中,content-type为json的情况下,后台服务器根本无法拿到param的参数,asp不知道有没有这样的问题,所以你的login先不要改动,看看能不能得到目前浏览器里一样的输出

    2017-11-28
    赞同
    回复
  • 云淡风轻
    云淡风轻
    2017-11-28

    现在在开发工具里再访问一次看看,记得截个图


    2017-11-28
    赞同
    回复
  • 陈炎平
    陈炎平
    2017-11-27

     19楼:

    你说的是什么意思?我没有直接访问443端口呀?

    2017-11-27
    赞同
    回复
  • 安静
    安静
    2017-11-27

    你直接访问443端口,不加https协议当然访问不了

    2017-11-27
    赞同
    回复

正在加载...