开发者社区> 问答> 正文

如何秘密告白:小程序 HTTPS 网络请求实现

如何秘密告白:小程序 HTTPS 网络请求实现

展开
收起
社区秘书 2020-04-27 14:28:06 1733 0
2 条回答
写回答
取消 提交回答
  • 木心的《从前慢》里说: 记得早先少年时 大家诚诚恳恳 说一句 是一句 …… 从前的日色变得慢 车,马,邮件都慢 一生只够爱一个人 从前的锁也好看 钥匙精美有样子 你锁了 人家就懂了 木心怀念着过去那个通过邮件传递信息的简单时代。 当下的网络时代虽然瞬息万变,但传递信息也是一样的“说一句,是一句”,“你 锁了,人家就懂了”。 小程序经常需要往服务器传递数据或者从服务器拉取信息。 当用户通过小程序加载服务器传来的信息时,整个网络过程如下: 1. 用户通过小程序向服务器发出 GET 请求, 2. 服务器发送一个响应,响应信息包含一个数据文件。 上面的流程也许过于简化,其实用户与服务器之间不可能面对面直接通话,因为它 们相隔不是很近,甚至服务器是在浏览器的千里之外,而客户端浏览器不可能直通 服务器。 每一次的网络请求,小程序传递给服务器的信息,中间经过多重的信息转达。同理 服务器回应小程序的响应也是同样的路径。 通俗点说,就是传纸条的原理。写字条的同学需要把字条递给旁边第一个同学,然 后第二个同学递给第三个同学,以此类推,一直传递到最后的信息接收者。 让我们看看,在传递字条的过程中,如果信息发出者想要给信息最末尾的接受者告 白,会发生什么呢? 在HTTP 状态下,传递者都可以打开字条,查看里面的内容。而且发送信息者无法知道传输路径,一旦发生信息窃取,甚至不知道是谁窃取的。 还是就是当信息落入心怀不轨的人手中,或者篡改信息内容,其后果不可设想。比如,把“你喜欢我吗?”篡改成“你不喜欢我吗?”。 为了避免这些情况发生,HTTP 安全版本应运而生,即HTTPS。通过HTTPS,传送的每次信息都被加上一个锁。 该锁配套的公钥和密钥仅小程序和服务器知道,其他传递者无法获取。因此,无论客户端发送的信息经过多个路由器,他人都无法读取信息内容。客户端发送初始信息到服务器时,在信息内容中包含服务器的名称(在名为“服务器名称指示”的字段中)。而服务器运行商可以在同一台计算机上运行多个站点, 因此运行商可以跟踪到客户端的访问轨迹。虽然初始的信息已设置了加密,但是初始请求是仍未加密的。这就是通过小程序my.request 安全传递告白信息的故事。本节将介绍如何使用my.request API 实现网络请求,并介绍一些使用注意事项。版本要求:基础库1.11.0 或更高版本;支付宝客户端10.1.32 或更高版本,若版本较低,建议做兼容处理。 my.request 目前只支持HTTPS 协议的请求。 使用说明:  请预先在 支付宝小程序管理中心 > 小程序详情 > 设置 > 开发设置 > 服务器域名白名单 中配置域名白名单。小程序在以下 API 调用时只能与白名单中的域名进行通讯:HTTP 请 求(my.request)、上传文件(my.uploadFile)、下载文件(my.downloadFile)和 WebSocket(my.connectSocket)。  添加服务器域名白名单后,需要重新打包上传生成体验版,服务器域名才会生效。  在 IDE 上进行调试时,请使用真机预览调试。  支付宝客户端已不再维护 my.httpRequest,建议使用 my.request。另外,钉钉客户端尚 不支持 my.request。若在钉钉客户端开发小程序,则需要使用 my.httpRequest。 扫码体验 重要:

     小程序开发过程中,可在开发工具内 详情 > 域名信息 > 忽略 httpRequest 域名合法性 检查 中选择是否忽略域名合法性检查,如果选择忽略,则在模拟器、预览以及真机调试场 景不会校验域名合法性,但小程序上线前必须确保通讯域名在白名单内,否则在正式版本无 法调用。  my.request 的请求头默认值为 {'content-type': 'application/json'},而不是{'contenttype': 'application/x-www-form-urlencoded'}。此外,请求头对象里面的 key 和 value 必须是 String 类型。 示例代码

    my.request({
     url: 'https://httpbin.org/post',
     method: 'POST',
     data: {
     from: '支付宝',
     production: 'AlipayJSAPI',
     },
     dataType: 'json',
     success: function(res) {
     my.alert({content: 'success'});
     },
     fail: function(res) {
     my.alert({content: 'fail'});
     },
     complete: function(res) {
     my.hideLoading();
     my.alert({content: 'complete'});
     }
    });
    // dataType 为 base64 示例
    my.request({
     url: 
    'https://gw.alipayobjects.com/mdn/miniapp_de/afts/img/A*G1kWSJbe2zEAAAAA
    AAAAAABjARQnAQ',
     method: 'GET',
     dataType: 'base64',
    success: (resp) => {
     console.log('resp data length', resp.data.length);
     console.log('resp data', resp.data); // 返回格式类似于:
    data:image/png;base64,iVBORw0KG...
     },
     fail: (err) => {
     console.log('error', err);
     },
    })
    

    入参

    Object 类型,属性如下: 属性 类型 必填 描述 url String 是 目标服务器 URL。 headers Object 否 设置请求的 HTTP 头对象,默认 {'content-type': 'application/json'},该对象里面 的 key 和 value 必须是 String 类型。 method String 否 默认 GET,目前支持 GET/POST/PUT/DELETE。 data Object 否 详见 data 参数说明。 timeout Number 否 超时时间,单位 ms,默认 30000。 dataType String 否 期望返回的数据格式,默认 JSON,支持 JSON、text、 base64、arraybuffer (10.1.70 版本开始支持) 。 success Function 否 调用成功的回调函数。 fail Function 否 调用失败的回调函数。 complete Function 否 调用结束的回调函数(调用成功、 失败都会执行)。 data 参数说明 传给服务器的数据最终会是 String 类型,如果 data 不是 String 类型,会被 转换成 String 。转换规则如下:  若方法为 GET,会将数据转换成 query string: encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=enc odeURIComponent(v)...  若方法为 POST 且 headers['content-type'] 为 application/json ,会对数据进行 JSON 序列化  若方法为 POST 且 headers['content-type'] 为 application/x-www-formurlencoded ,会将数据转换成 query string: encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=enc odeURIComponent(v)... success 回调函数 入参为 Object 类型,属性如下: 属性 类型 描述 data String 响应数据,格式取决于请求时的 dataType 参数, 如果 dataType 值为 base64 时,返回的是符合 data URI scheme 规范的内容字符串。 status Number 响应码。 headers Object 响应头。 返回值 RequestTask 网络请求任务对象。调用 my.request 后返回的请求对象。 RequestTask.abort() 中断请求任务。 示例代码

    const task = my.request({url: 'https://httpbin.org/post'})
    task.abort();
    

    “抱歉,不是我的菜”:小程序扫码点餐化解尴 尬 月上柳梢头,人约黄昏后。 周五到了,小心翼翼约她出来吃晚饭,她欣然应约。 餐厅位于徐汇区闹中取静的华山路,法式梧桐的点缀让餐厅更显典雅,也更富有异 国情调。踏入餐厅,灯光是橘色的,餐具是蓝的,桌椅也是蓝的,让人恍惚之间有 到了爱琴海边的错觉,唯美的装修风格、充满欧洲风味的精致美食,处处洋溢着地 中海风情,真浪漫啊。 她翩翩而至,裙裾飞扬。 见到她我脸红了。我紧张地问她要吃些什么,又手忙脚乱地叫来服务员点完了菜, 脸上冒出了小汗珠。 窗外的小雨滴滴答答,窗内的我们显得格外安静。 我鼓起勇气,打破沉默,小声问道:“你……你对我印象如何?” “抱歉,不是我的菜……” 此刻,我如同五雷轰顶,只觉天旋地转,眼前华光溢彩的餐厅瞬间变得黯淡了。 “你是不是点错菜了?还是上错菜了呢?”她指着桌上的法式田螺和奶油蘑菇汤, 瞪大了眼睛问我。旁边站着满脸疑惑的上菜员。 如何化解点错菜的尴尬呢?这时就需要使用支付宝小程序扫码点餐的功能了。

    为了让用户减少输入,我们可以把复杂的信息编码成一个二维码,利用 my.scan API 调起支付宝扫一扫,用户扫码之后,my.scan 的 success 回调会收到这个 二维码所对应的字符串信息。 例如餐厅点餐的小程序,我们给餐厅中每个餐桌编号 1-100 号,把这个数字编码 到二维码中,扫码获得编号之后,就可以知道是哪一桌点的菜,大大提高点餐体验 和效率。

    //page.js
    Page({
     // 点击“扫码订餐”的按钮,触发 tapScan 回调
     tapScan: function() {
     // 调用 my.login 获取微信登录凭证
     my.scanCode({
     success: function(res) {
     var num = res.result // 获取到的 num 就是餐桌的编号
     }
     })
     }
    })
    

    还有很多场景可以结合支付宝 App 扫码能力做到很好的体验,例如通过扫商品 上的一维码做一个商品展示的小程序;通过扫共享单车上的二维码去开启单车。我 们可以多思考如何利用这个扫码能力去替代一些繁琐的输入操作,让我们的小程序 变得更加便捷。 示例代码

    // API-DEMO page/API/scan-code/scan-code.json
    {
     "defaultTitle": "Scan"
    <!-- API-DEMO page/API/scan-code/scan-code.axml-->
    <view class="page">
     <view class="page-section">
     <form onSubmit="scanCode">
     <view>
     <button type="primary" onTap="scan">扫码</button>
     </view>
     </form>
     </view>
    </view>
    

    // API-DEMO page/API/scan-code/scan-code.js Page({ scan() { my.scan({ type: 'qr', success: (res) => { my.alert({ title: res.code }); }, }); } }) 入参 Object 类型,属性如下: 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library

    2020-04-27 15:46:55
    赞同 展开评论 打赏
  • 如何表白   你好!哥们,我是过来人了,经历过你们e799bee5baa6e58685e5aeb931333335326238这种阶段,确实很有意思也很纠结,下面听哥们好好说。   看了你的情况,我分析了下,现在这个世道啊要想成功追女!不能用常规方法了!特别现在你们都有个误区,都想表白才觉得自己怎么怎么了,然后表白完了等别人“承认”,我说的没错吧‘   这样很容易失败的,兄弟。特别是如果对方对你没啥感觉那种。其实呢是可以先亲了她在表白!这样对方既有新鲜感有刺激,要是初吻的话更加死心塌地呢!   现在追你孩子一定要快准狠,我是说最关键那时候啊,你听我说啊,一个字一个字打给你,不能按常规出牌了,像平时那样追女生的逻辑已经过时!   下面我会告诉你一些我的经历吧和我的理解。希望对你有帮助!!   我的经验:当你喜欢一个女孩子,你就要冷静先,别想得太美好。   接着,你要做的事,就是找机会,大家一起活动的时候,和他慢慢套近乎。注意,你平时别老是在她身边晃,这样人家会反感的,你要做的事,就是把自己变得优秀,各方面,增加自己的资本。比如弹钢琴,跳街舞,电脑编程,还有什么唱歌很好,写字很漂亮,书法,这些,当然最重要是事业!!!搞好你的事业,赚钱多了,学生的话学习好了,那么你的关注度就高了。竞争力也大了!   我很真心的分享我的经验,希望你可以从中学到精髓!总之就是“泡妞,欲速则不达,欲求则不得,要若即若离,循序渐进,最后夺去她的芳心!还有就是不要老师在她身边晃,你要积累资本!懂吗,女人不喜欢那种整天在她身边转的人!   你下一步,就是慢慢发展,慢慢的约她,然后无意识的试着和他分享你的小秘密,让你们两个变成无话不说的好朋友,最后在某次,然后在哪天比较人少的时候,你们又一起聊天,你就试着问她男女朋友的问题,然后给他暗示,那个时候,别胆小,最好去喝杯酒,你觉得把握得好,就可以问她比如你觉得我是个怎么样的人,什么之类的,然后趁他犹豫,直接吻她,搞定,表白,那是以后你们亲热的时候再说的,哈哈。   我就是这样成功的,总之,这是一个不能急的事情,到最后成功的那一刻,你才会感受到你这些时间的路走过来总算pay off了,那种感觉,太美妙了!哈哈,说到这里不妨再分享下我表白的过程:我表白时对我女朋友说的是:X,你知道吗,在对的时间能遇到一个对的人,人这一辈子没有几次这样的机会。我现在遇到的那个人就是你,希望你能给我一次机会让我好好爱你,亲爱的! 然后我女朋友想都没想就扑到我怀里不肯起来了!!   (当然当时我们两个聊天聊得很暧昧了。我感觉是时候了,时机一定要把握好!不可太急,因为女孩喜欢浪漫的时候,温馨的感觉!这样他一辈子也忘不掉!最好称她犹豫可以亲她!不过你要准备好被她删一巴掌,当然我认为这不算什么!毕竟你要得到你的幸福,一巴掌代价就太小了!   其实表白实际上就是一个形式而已,正确的顺序应该是:事实上已经成为你女朋友了,你才能向人家表白,水到渠成。 很多人弄不明白这个问题,总以为人家先答应做自己女朋友,然后再如何如何,我只能说他非常非常“单纯”,也非常非常“愚蠢”。   有没有“迫不得已非表白不可”的时候?   有,比如说出现第三者,或者你和女孩子关系没有成熟但两个人可能分开一段时间。这时候的表白就是条件不成熟的表白,风险非常大,类似于下围棋的时候形势严峻,落后的一方迫于无奈放出“胜负手”,赢了就赢了,输了也只能说“倒霉都是天生的”。   “爱”字不要轻易出口 经常看见论坛出现“大胆的表白”,说实话我真的认为这是非常不成熟的一种表现。“爱”是一个神圣的字,意味着追求,也意味着承诺,甚至体现出一种责任。   haha,还有你知道最高境界是啥吗,就是男的直到跟女的上床了都没问过“你是否愿意做我女朋友”,最后还是女孩子急了:“你怎么还不求我做你女朋友啊!”   完全我自己写的,亲身感受,希望可以帮到楼主!写得累死我啦……哈,没想到还不少啊。不管那么多啦能帮到你就行!!!按我这方法,成功率非常高的,有很凑效!女生都喜欢刺激的、呵呵   祝楼主早日追求到幸福!!!!生活愉快!   有什么问题可以留言乐意为你解答!!   第二次补充回答……   哥们啊   千万别别那么快让她察觉到,不然有些女生不给力会很伤你积极性的。   你看反正你做那些都是提高实力的都东西对以后也有用嘛……你说呢

    2020-04-27 14:38:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《使用Serverless服务快速开发小程序》 立即下载
《云市场-小程序》 立即下载
数字乡村建设方案 立即下载