微信小程序开发:http请求

作者: 姜家志 | 来源:发表于2016-09-25 19:38 被阅读34025次

在微信小程序进行网络通信,只能和指定的域名进行通信,微信小程序包括四种类型的网络请求。

  • 普通HTTPS请求(wx.request)
  • 上传文件(wx.uploadFile)
  • 下载文件(wx.downloadFile)
  • WebSocket通信(wx.connectSocket)

这里以介绍wx.request,wx.uploadFile,wx.dowloadFile三种网络请求为主

设置域名

要微信小程序进行网络通信,必须先设置域名,不然会出现错误:

URL 域名不合法,请在 mp 后台配置后重试

需要在微信公众平台的小程序中设置域名。
在微信小程序的设置界面可以看到设置选项:

设置

选择开发设置

开发设置

可以看到服务器设置:

服务器设置
在这里可以设置对应四种网络访问的域名,每一种类型的网络请求需要设置一个域名,注意如果在这里设置域名为https://example.com/api/,那么https://example.com/api是无法调用的,必须加上后面/

http请求

使用wx.request可以发起一个http请求,一个微信小程序被限制为同时只有5个网络请求

function queryRequest(data){    
    wx.request({
        url:"https://example.com/api/",
        data:data,
        header:{
           // "Content-Type":"application/json"
        },
        success:function(res){
            console.log(res.data)
        },
        fail:function(err){
            console.log(err)
        }

    })

}

上面的代码会发送一个http get请求,然后打印出返回的结果。其中的参数也比较容易理解。

  • url 服务器的url地址
  • data 请求的参数可以采用String data:"xxx=xxx&xxx=xxx"的形式或者Object data:{"userId":1}的形式
  • header 设置请求的header
  • success 接口成功的回调
  • fail 接口失败的回调

另外还有两个参数没有在代码里:

  • method http的方法,默认为GET请求
  • complete 调用接口结束之后的回调,无论成功或者失败该接口都会被调用

上传文件

上传文件的api为wx.uploadFile,该api会发起一个http post请求,其中的Content-typemultipart/form-data。服务器端需要按照该Content-type类型接收文件,示例代码:

function uploadFile(file,data) {
    wx.uploadFile({
        url: 'http://example.com/upload',
        filePath: file,
        name: 'file',
        formData:data,
        success:function(res){
            console.log(res.data)
        },
        fail:function(err){
            console.log(err)
        }

    })
    
}

其中的urlheadersuccessfail以及complete和普通的http请求是一样的。
这里有区别的参数是:

  • name文件对应的key,服务器端需要通过name参数获取文件
  • formData http请求中可以使用的其他参数

下载文件

下载文件的api为wx.downloadFile,该api会发起一个http get请求,并在下载成功之后返回文件的临时路径,示例代码:

function downloadFile(url,typ,success){
    wx.downloadFile({
        url:url,
        type:typ,
        success:function(res){
            if(success){
                success(res.tempFilePath)
            }
        },
        fail:function(err){
            console.log(err)
        }
    })
}

其中的url,header,fail,completewx.uploadFile的参数使用是一致的,其中有区别的参数是:

  • type:下载资源的类型,用于客户端自动识别,可以使用的参数image/audio/video
  • success:下载成功之后的回调,以tempFilePath的参数返回文件的临时目录:res={tempFilePath:'文件路径'}
    下载成功后的是临时文件,只会在程序本次运行期间可以使用,如果需要持久的保存,需要调用方法wx.saveFile主动持久化文件,实例代码:
function svaeFile(tempFile,success){
    wx.saveFile({
        tempFilePath:tempFile,
        success:function(res){
            var svaedFile=res.savedFilePath
            if(success){
                success(svaeFile)
            }
        }
    })
}

使用wx.saveFile保存临时文件到本地,提供给小程序下次启动时使用,其中的参数:

  • tempFilePath 需要被保存文件的路径
  • success 保存成功的回调,返回保存成功的路径,使用res.savedFilePath可以获取保存成功的路径
  • fail 失败的回调
  • complete结束的回调

超时的设置

微信小程序开发:MINA中已经提到了在app.js中设置networkTimeout可以设置四种类型网络访问的超时时间:

"networkTimeout":{
   "request": 10000,
   "connectSocket": 10000,
   "uploadFile": 10000,
   "downloadFile": 10000
}

这里设置的超时时间对应着四种类型的网络请求。

源代码请参考:https://github.com/jjz/weixin-mina/blob/master/api/api.js

相关文章

网友评论

  • 苏敏:现在新增了一个 web-view 类型的域名
  • 北冥风尘:request请求可以是http的吗?
  • 0bce343be48f:小程序请求url中必须带域名吗?在微信公众平台的小程序中设置域名了在请求中还学写吗
  • f76281add009:《微信小程序开发:http请求 - 简书》写的挺不错的,已经收藏了。

    源码解析:http://sina.lt/fdcQ


    8afe04d66ee7:恩恩

    还不错那
  • eac9c509c342:大神请教一下 在下载方法中不能使用一个网络上的url下载地址吗? 我在电脑上测试用了一个图片的url下载地址是可以的 然后我转到手机测试发现报错“不在以下合法域名列表中,请参考文档” 也没提及到后台配置的问题 所以搞不懂是配置的问题还是url不合法的问题 望告知
    姜家志: @N7Y 看资料收集那篇里的文档
    eac9c509c342:@姜家志 有没有相关的文档 或者相关类的文章呢
    姜家志: @N7Y 下载图像有专门的配置
  • 5955878b8313:请问大神video标签下的地址可以用http吗
    方振:@宝贝你最美 有好多图片跟mp3放到服务器,服务器是http的,可以正常使用这些资源吗:pray:
    vobear:页面上是支持http和https的,就是发起request请求时,只能支持https
  • CharTen:博主你好,最近遇到一个问题,就是wx.request发起一个post请求,我已经将header的content-type设置为application/x-www-form-urlencoded了,但是post上去后,我后台(express)拿到的req.body还是为空。。。好纳闷啊。。。
    姜家志:@CharTen 抓包看下
  • 0e614f51ea2b:博主那个合法域名是默认80端口吗?就是请求其它端口会报错是吗?
  • welee:"不在以下合法域名列表中"
    已经正确添加了https 域名, 但是wx.request调起api请求报错, 请问是什么问题?
    welee:@姜家志 问题早解决了, 是路径的问题, 谢谢
    姜家志:@welee 报错信息是什么?
  • ab397b8251f2:小程序设置域名是不是只能https请求,http你说可以,能告诉我是怎么配置上去的吗?配置的时候那个默认就是https
    姜家志:@ab397b8251f2 我写的有问题只能使用https
  • 84d7b69f5e7e:大神问几个问题:
    https 请求是不是需要网站也要配置这种小程序才支持?
    如果公司多个业务,那同一个域名不同端口的url 就访问不了吗?
    姜家志:@84d7b69f5e7e 自己做跳转吧!只能使用一个https只能使用一个域名
  • 57f85b17112a:微信小程序的服务器配置是https域名的?http域名就不行吗
  • 94185ebd4d7c:今天公测之后有个很奇怪的问题:
    在电脑上测试的时候请求正常;
    但是在手机上预览的时候就报fail错了,返回的内容是errMsg:"request:fail send request fail"
    后台也没有接到数据
    94185ebd4d7c:@treadpit 到现在还没解决掉,我的已经是https了,也报这个错,有点奇怪
    f343dfe74873:@hhhhh_飞 请问你是怎么解决的呢?我也遇到这个问题了 :cry:
    94185ebd4d7c:@hhhhh_飞 我的请求是https请求,也加了合法域名了
  • 1ffb7c2d5cf3:目前不知道是不是bug,小程序的post请求确实不正确,我这初步判断的原因是header 设置不正确,即使设置"Content-Type": "application/x-www-form-urlencoded",最终请求的也不是这个
    而是Content-Type:application/x-www-form-urlencoded, application/json。不知道为什么要在后面自动拼接这个。
    所以导致 没有fromDate数据,而变成了 request payLoad。

    所以其实数据是发送到服务器了,只是服务器(spring mvc等)解析不到这个参数。
    如果硬要解析,只能是手动做。
    __learning__:@maml 只能自己转

    ```
    function jsonToFormData(json) {
    return Object.keys(json).reduce((prev, next) => {
    return prev.concat(next + '=' + encodeURIComponent(json[next]));
    }, []).join('&');
    }

    wx.request({
    data: jsonToFormData({...})
    });
    ```
  • d4042ebca29d:http不能用post请求吗?为什么啊
    姜家志:@任由时间丶划过指尖 什么错?
    d4042ebca29d:@姜家志 https也不行啊,post 请求后台还是获取不到值
    姜家志:@任由时间丶划过指尖 只能用https
  • xiaop2019:https接口收到的请求IP是腾讯服务器的呢 还是用户手机的ip呢
  • xiaop2019:请问https的请求是从腾讯服务器到我们自己的服务器呢 还是由客户端直接请求我们的服务器呢?
  • hayao650:你好,我在测试小程序的时候,发起http请求,使用post方法,但是服务器,接收不到发送的数据,使用get方法能够正确接收到数据,你遇到过么?怎么解决呢?谢谢
    姜家志:@hayao650 必须要求https呀
    hayao650:没有用https
    姜家志:@hayao650 https配置不对吧
  • ebebc75082ba:您好,请教一下,我昨天测试websocket连接localhost是没有问题的,今天测试downloadFile,url也是localhost,没有任何反应,是域名设置的问题吗?
    是不是没有受到邀请就无法设置域名?服务器设置那里有默认的域名设置吗?
    姜家志:@beta2004 设置域名需要在管理界面设置,没有内测应该进不去
  • heguorui:大大,求指教,小程序是基于腾讯的x5浏览器内核么?还是完全微信自己的界面渲染绘制,wxml会是什么原理绘制成界面呢?
    姜家志:@heguorui 不是基于浏览器的,在开发的时候会使用html+css就是我们在ide中看到的,而在微信上面使用的是wx-native 渲染,直接调用Native组件绘制成界面的,这部分有一些类似与react-native。
  • daac383a9088:小程序是不是只能发起https请求,http可以吗?
    ab397b8251f2:@姜家志 怎么使用http?在线等
    daac383a9088:@姜家志 :+1:
    姜家志:@金一山 可以的,建议还是用https

本文标题:微信小程序开发:http请求

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