版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章小程序API-Part2電子工業(yè)出版社在第6章對(duì)微信小程序的基本API做了介紹,包括基礎(chǔ)功能、界面操作功能、頁(yè)面跳轉(zhuǎn)控制功能、媒體處理功能等。本章對(duì)微信小程序的網(wǎng)絡(luò)通信API、設(shè)備控制API、AI功能API、還有微信開放能力API等進(jìn)行介紹。目錄7.1網(wǎng)絡(luò)通信API7.2分享/轉(zhuǎn)發(fā)API7.3設(shè)備API7.4微信開放接口API7.5案例:在線相冊(cè)7.6練習(xí):讀書分享7.1網(wǎng)絡(luò)通信API現(xiàn)代應(yīng)用程序,當(dāng)然也包括微信小程序都需要與外界進(jìn)行信息交換,而這個(gè)信息交換是通過網(wǎng)絡(luò)通信完成的。因此,微信小程序提供了一組專門進(jìn)行網(wǎng)絡(luò)通信的API供開發(fā)小程序時(shí)使用。本節(jié)對(duì)微信的網(wǎng)絡(luò)通信進(jìn)行介紹。7.1.1獲取網(wǎng)絡(luò)狀態(tài)和網(wǎng)絡(luò)IP地址API在可以使用網(wǎng)絡(luò)進(jìn)行通信之前,需要先獲取網(wǎng)絡(luò)的狀態(tài),簡(jiǎn)言之就是“當(dāng)前網(wǎng)絡(luò)可用嗎?如果可用的話,當(dāng)前網(wǎng)絡(luò)的連接方式是哪種?是WIFI、2G、3G、4G、5G?信號(hào)強(qiáng)度如何?”等等。為了回答這個(gè)問題,微信提供了wx.getNetworkType(Objectobject)函數(shù)。函數(shù)wx.getNetworkType(Objectobject)獲取網(wǎng)絡(luò)的相關(guān)狀態(tài)信息,它接受一個(gè)Object對(duì)象參數(shù),Object參數(shù)對(duì)象的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性名稱、屬性類型及其含義如下:networkType,string,網(wǎng)絡(luò)類型??赡苤担簑ifi、2g、3g、4g、5g、unknown、none;signalStrength,number,信號(hào)強(qiáng)弱,單位dbm;hasSystemProxy,boolean,設(shè)備是否使用了網(wǎng)絡(luò)代理。2failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)3completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)在存在可用網(wǎng)絡(luò)的前提下,可以使用wx.getLocalIPAddress(Objectobject)函數(shù)獲取網(wǎng)絡(luò)的IP地址。這個(gè)函數(shù)接受一個(gè)Object對(duì)象參數(shù),Object參數(shù)對(duì)象的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性名稱、屬性類型及其含義如下:localip,string,本機(jī)局域網(wǎng)IP地址;netmask,string ,本機(jī)局域網(wǎng)子網(wǎng)掩碼。2failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)3completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)7.1.2圖書信息服務(wù)器網(wǎng)絡(luò)通信會(huì)涉及到兩個(gè)程序:一個(gè)服務(wù)器程序和一個(gè)客戶端程序。這種架構(gòu)非常典型,因此被賦予一個(gè)簡(jiǎn)潔的名字:C/S模式,也就是客戶/服務(wù)器模式。在C/S模式中,服務(wù)器為客戶端提供數(shù)據(jù)服務(wù),而客戶端則可以隨時(shí)按需從服務(wù)器請(qǐng)求數(shù)據(jù)。微信小程序是一種典型的客戶端程序,因此,為了建立可以進(jìn)行網(wǎng)絡(luò)通信的環(huán)境,需要架設(shè)一個(gè)服務(wù)端程序。本書開發(fā)了一個(gè)簡(jiǎn)單的“圖書信息服務(wù)器”程序,它提供了如下基本的服務(wù)接口:1、獲取所有圖書信息(不包括圖書封面圖片)微信小程序使用該接口可以從服務(wù)器上獲取所有圖書的信息。采用HTTP協(xié)議,格式定義如下。后臺(tái)服務(wù)器系統(tǒng)處理請(qǐng)求后,采用如下格式對(duì)請(qǐng)求進(jìn)行應(yīng)答:請(qǐng)求地址http://****/book/all協(xié)議版本HTTP1.1請(qǐng)求方法GET編碼UTF-8封裝類型application/json參數(shù)名稱參數(shù)類型是否必須描述無(wú)
協(xié)議版本HTTP1.1編碼UTF-8封裝類型JSONObject參數(shù)名稱參數(shù)類型是否必須描述圖書的完整信息,JSONArray,每個(gè)元素是如下的Object對(duì)象,屬性及含義如下:idint
圖書的idnamestring
書名pressstring
出版社covernull
圖書的封面2、獲取指定ID的圖書封面圖片微信小程序使用該接口可以從服務(wù)器上獲取指定ID的圖書封面圖像。采用HTTP協(xié)議,格式定義如下。后臺(tái)服務(wù)器系統(tǒng)處理請(qǐng)求后,采用如下格式對(duì)請(qǐng)求進(jìn)行應(yīng)答:請(qǐng)求地址http://****/book/cover/{id}協(xié)議版本HTTP1.1請(qǐng)求方法GET編碼UTF-8封裝類型application/json參數(shù)名稱參數(shù)類型是否必須描述idint是圖書的ID協(xié)議版本HTTP1.1編碼UTF-8封裝類型二進(jìn)制流參數(shù)名稱參數(shù)類型是否必須描述圖像數(shù)據(jù)流3、修改指定ID的圖書封面圖片微信小程序使用該接口可以在服務(wù)器上修改指定ID的圖書封面圖像。采用HTTP協(xié)議,格式定義如下。后臺(tái)服務(wù)器系統(tǒng)處理請(qǐng)求后,采用如下格式對(duì)請(qǐng)求進(jìn)行應(yīng)答:請(qǐng)求地址http://****/book/cover/{id}協(xié)議版本HTTP1.1請(qǐng)求方法POST編碼UTF-8封裝類型multipart/form-data參數(shù)名稱參數(shù)類型是否必須描述coverbinary是圖書的封面二進(jìn)制流協(xié)議版本HTTP1.1編碼UTF-8封裝類型二進(jìn)制流參數(shù)名稱參數(shù)類型是否必須描述successint是0:成功;1:失敗messagestring否失敗原因采用SpringMVC實(shí)現(xiàn)如上這些接口功能,代碼如下:importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.apache.tomcat.util.http.fileupload.IOUtils;importorg.springframework.util.ResourceUtils;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;
importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;import.URLEncoder;importjava.util.ArrayList;importjava.util.Objects;
@RestControllerpublicclassWXController{staticArrayList<Book>alb=newArrayList<Book>();static{Bookb1=newBook();b1.id=1;="C語(yǔ)言程序設(shè)計(jì)";b1.press="清華大學(xué)出版社";try{Filef1=ResourceUtils.getFile("classpath:images/clang.jpg");b1.cover=newbyte[(int)f1.length()];IOUtils.readFully(newFileInputStream(f1),b1.cover);}catch(IOExceptione){thrownewRuntimeException(e);}alb.add(b1);
Bookb2=newBook();b2.id=2;="AndroidStudio移動(dòng)應(yīng)用開發(fā)";b2.press="電子工業(yè)出版社";try{Filef2=ResourceUtils.getFile("classpath:images/android.jpg");b2.cover=newbyte[(int)f2.length()];IOUtils.readFully(newFileInputStream(f2),b2.cover);}catch(IOExceptione){thrownewRuntimeException(e);}alb.add(b2);}@GetMapping("/book/all")publicArrayList<Book>getAllBooks(HttpServletRequestrequest){Strings=request.getScheme();Stringa=request.getLocalAddr();intp=request.getLocalPort();Stringcp=request.getServletContext().getContextPath();for(Bookb:alb){b.path=s+"://"+a+":"+p+cp+"/book/cover/"+b.id;}returnalb;}
@GetMapping("/book/cover/{id}")publicbyte[]getCoverById(@PathVariable("id")Integerid,HttpServletResponseresponse)throwsException{
for(Bookb:alb){if(Objects.equals(b.id,id)){response.setContentType("image/jpeg");response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode("cover"+id+".jpg","UTF-8"));returnb.cover;}}thrownewException("圖書ID不存在");}
@PostMapping("/book/cover/{id}")publicvoiduploadCoverById(@PathVariable("id")Integerid,@RequestParam("cover")MultipartFilecover)throwsIOException{for(Bookb:alb){if(Objects.equals(b.id,id)){b.cover=cover.getBytes();return;}}}
publicstaticclassBook{publicIntegerid;publicStringname;publicStringpress;publicStringpath;transientpublicbyte[]cover;}}7.1.3發(fā)起請(qǐng)求使用RequestTaskwx.request(Objectobject)函數(shù)發(fā)起一個(gè)像指定服務(wù)器的請(qǐng)求,該函數(shù)接受一個(gè)Object對(duì)象參數(shù)并返回一個(gè)RequestTask對(duì)象。Object對(duì)象參數(shù)的屬性及其含義表:序號(hào)屬性名類型默認(rèn)值必填說明1urlstring無(wú)是開發(fā)者服務(wù)器接口地址2data string/object/ArrayBuffer無(wú)否請(qǐng)求的參數(shù)3headerObject無(wú)否設(shè)置請(qǐng)求的header,content-type默認(rèn)為application/json4timeoutnumber無(wú)否超時(shí)時(shí)間,單位為毫秒。默認(rèn)值為600005methodstringGET否HTTP請(qǐng)求方法??蛇x值:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT6dataTypestringjson否返回的數(shù)據(jù)格式??蛇x值:json,返回的數(shù)據(jù)為JSON,返回后會(huì)對(duì)返回的數(shù)據(jù)進(jìn)行一次JSON.parse;其他,不對(duì)返回的內(nèi)容進(jìn)行JSON.parse。7responseTypestringtext否響應(yīng)的數(shù)據(jù)類型??蛇x值:text,響應(yīng)的數(shù)據(jù)為文本;arraybuffer,響應(yīng)的數(shù)據(jù)為ArrayBuffer8successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性及其含義如表7-4所示。9failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性、類型及其含義如下:errMsg,String,錯(cuò)誤信息;errno,Number,錯(cuò)誤碼。10completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)success回調(diào)函數(shù)的Object參數(shù)對(duì)象的屬性序號(hào)屬性名稱類型含義1datastring/Object/Arraybuffer開發(fā)者服務(wù)器返回的數(shù)據(jù)2statusCodenumber開發(fā)者服務(wù)器返回的HTTP狀態(tài)碼3headerObject開發(fā)者服務(wù)器返回的HTTPResponseHeader4cookiesArray.<string>開發(fā)者服務(wù)器返回的cookies,格式為字符串?dāng)?shù)組5exceptionObject網(wǎng)絡(luò)請(qǐng)求過程中的一些異常信息,例如httpdns重試等7.1.4文件下載使用DownloadTaskwx.downloadFile(Objectobject)函數(shù)可以從服務(wù)器上下載指定的文件到本地臨時(shí)路徑,單次下載允許的最大文件為200MB。該函數(shù)接受一個(gè)Object對(duì)象參數(shù)并返回一個(gè)DownloadTask對(duì)象。Object對(duì)象參數(shù)的屬性及其含義表:序號(hào)屬性名類型默認(rèn)值必填說明1urlstring無(wú)是下載資源的url2headerObject無(wú)否HTTP請(qǐng)求的Header3timeoutnumber60000否超時(shí)時(shí)間,單位為毫秒4filePathstring無(wú)否指定文件下載后存儲(chǔ)的路徑(本地路徑)5successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性及其含義如表7-6所示。6failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性、類型及其含義如下:errMsg,String,錯(cuò)誤信息;errno,Number,錯(cuò)誤碼。7completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)success回調(diào)函數(shù)的Object參數(shù)對(duì)象的屬性:序號(hào)屬性名稱類型含義1tempFilePathstring臨時(shí)文件路徑(本地路徑)。沒傳入filePath指定文件存儲(chǔ)路徑時(shí)會(huì)返回,下載后的文件會(huì)存儲(chǔ)到一個(gè)臨時(shí)文件2filePathstring用戶文件路徑(本地路徑)。傳入filePath時(shí)會(huì)返回,跟傳入的filePath一致3statusCodenumber開發(fā)者服務(wù)器返回的HTTP狀態(tài)碼7.1.5文件上傳使用UploadTaskwx.uploadFile(Objectobject)函數(shù)將本地文件上傳到服務(wù)器,header中的content-type為multipart/form-data。該函數(shù)接受一個(gè)Object對(duì)象參數(shù)并返回一個(gè)UploadTask對(duì)象。Object對(duì)象參數(shù)的屬性及其含義表:序號(hào)屬性名類型默認(rèn)值必填說明1urlstring無(wú)是開發(fā)者服務(wù)器地址2filePathstring無(wú)是要上傳文件資源的路徑(本地路徑)3namestring無(wú)是文件對(duì)應(yīng)的key,開發(fā)者在服務(wù)端可以通過這個(gè)key獲取文件的二進(jìn)制內(nèi)容4headerObject無(wú)否HTTP請(qǐng)求Header5formDataObject無(wú)否HTTP請(qǐng)求中其他額外的formdata6timeoutnumber無(wú)否超時(shí)時(shí)間,單位為毫秒7successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性名稱、類型及其含義如下:data,string,開發(fā)者服務(wù)器返回的數(shù)據(jù);statusCode,number,開發(fā)者服務(wù)器返回的HTTP狀態(tài)碼。8failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。接受一個(gè)Object參數(shù)對(duì)象,該對(duì)象的屬性、類型及其含義如下:errMsg,String,錯(cuò)誤信息;errno,Number,錯(cuò)誤碼。9completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)7.1.6網(wǎng)絡(luò)通信API應(yīng)用綜合舉例這個(gè)例子結(jié)合前面介紹的圖書信息系統(tǒng)的服務(wù)端程序,通過微信小程序查看圖書信息,并且用戶可以通過微信小程序修改圖書的封面圖片。為此,新建一個(gè)名稱為mini-ch07-01的小程序工程,修改index.wxml文件為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><viewclass="container"wx:for="{{books}}"><imagesrc="{{item.path}}"bind:tap="change"id="{{item.id}}"mode="heightFix"></image><text>{{}}</text><text>{{item.press}}</text></view></scroll-view>修改index.js為如下內(nèi)容://index.jsvarthat={};Page({data:{books:[]},onReady(e){that=this;wx.request({url:'29:8080/book/all',header:{'content-type':'application/json'//默認(rèn)值},success(res){that.setData({books:res.data});}})},change(e){letid=e.target.id;wx.chooseMedia({count:1,mediaType:['image'],sourceType:['album','camera'],success(res){wx.uploadFile({filePath:res.tempFiles[0].tempFilePath,name:'cover',url:'29:8080/book/cover/'+id,success(e){for(vari=0;i<that.data.books.length;i++){if(that.data.books[i].id==id){console.log("Got!")that.data.books[i].path=res.tempFiles[0].tempFilePath;that.setData({books:that.data.books});break;}}},fail(e){console.log("fail:");console.log(e);}});}})}})微信規(guī)定:任何小程序只能與已經(jīng)注冊(cè)并且已經(jīng)通過微信認(rèn)證的服務(wù)器進(jìn)行網(wǎng)絡(luò)通過,這些通信包括通過wx.request(Objectobject)請(qǐng)求發(fā)起、wx.downloadFile(Objectobject)發(fā)起和wx.uploadFile(Objectobject)發(fā)起的所有請(qǐng)求。為了方便小程序開發(fā)和調(diào)試,在開發(fā)和調(diào)試期間,可以在微信開發(fā)者工具中打開“不校驗(yàn)合法域名”設(shè)置來(lái)申請(qǐng)微信不執(zhí)行網(wǎng)絡(luò)通信校驗(yàn),如圖所示:運(yùn)行這個(gè)程序,顯示如圖所示的界面:7.2分享/轉(zhuǎn)發(fā)API分享/轉(zhuǎn)發(fā)信息涉及到兩個(gè)層面:其一,可以分享/轉(zhuǎn)發(fā)小程序頁(yè)面;其二,可以分享/轉(zhuǎn)發(fā)小程序頁(yè)面內(nèi)的某個(gè)信息,例如,頁(yè)面內(nèi)的某個(gè)圖片、某個(gè)視頻或者某個(gè)文件。下面從這兩個(gè)層面對(duì)分享/轉(zhuǎn)發(fā)API做介紹。7.2.1分享/轉(zhuǎn)發(fā)小程序頁(yè)面微信提供了兩種觸發(fā)分享/轉(zhuǎn)發(fā)小程序頁(yè)面的方式:其一,通過微信小程序右上角三個(gè)點(diǎn)的分享/轉(zhuǎn)發(fā)按鈕觸發(fā);其二,在頁(yè)面中使用一個(gè)open-type="share"的button組件觸發(fā)。無(wú)論采用哪種方式觸發(fā),為了完成分享/轉(zhuǎn)發(fā)功能,在頁(yè)面js文件的Page函數(shù)中,都需要實(shí)現(xiàn)如下兩個(gè)回調(diào)函數(shù):onShareAppMessage(Objectobject)函數(shù)用于轉(zhuǎn)發(fā)給好友/微信群;onShareTimeline(Objectobject)轉(zhuǎn)發(fā)到朋友圈。1、onShareAppMessage(Objectobject)回調(diào)函數(shù)onShareAppMessage(Objectobject)回調(diào)函數(shù)用于監(jiān)聽用戶點(diǎn)擊右上角菜單“轉(zhuǎn)發(fā)”按鈕或者點(diǎn)擊頁(yè)面內(nèi)轉(zhuǎn)發(fā)按鈕(button組件open-type=“share”)或的行為,并自定義轉(zhuǎn)發(fā)內(nèi)容。微信客戶端在回調(diào)這個(gè)函數(shù)時(shí),會(huì)傳遞一個(gè)Object對(duì)象參數(shù),這個(gè)對(duì)象參數(shù)的屬性及其含義如表:onShareAppMessage(Objectobject)回調(diào)函數(shù)需要返回(return)一個(gè)Object,用于自定義轉(zhuǎn)發(fā)內(nèi)容,這個(gè)Object的屬性及其含義如表:序號(hào)屬性名類型說明1fromString轉(zhuǎn)發(fā)事件來(lái)源。button:頁(yè)面內(nèi)轉(zhuǎn)發(fā)按鈕;menu:右上角轉(zhuǎn)發(fā)菜單2targetObject如果from值是button,則target是觸發(fā)這次轉(zhuǎn)發(fā)事件的button,否則為undefined3webViewUrlString頁(yè)面中包含web-view組件時(shí),返回當(dāng)前web-view的url序號(hào)屬性名類型說明1titlestring轉(zhuǎn)發(fā)標(biāo)題。默認(rèn)值:當(dāng)前小程序名稱2pathstring轉(zhuǎn)發(fā)路徑
默認(rèn)值:當(dāng)前頁(yè)面path,必須是以“/”開頭的完整路徑3imageUrlstring自定義圖片路徑,可以是本地文件路徑、代碼包文件路徑或者網(wǎng)絡(luò)圖片路徑。支持PNG及JPG。顯示圖片長(zhǎng)寬比是5:4。默認(rèn)值:使用默認(rèn)截圖。4promiseObject如果該參數(shù)存在,則以resolve結(jié)果為準(zhǔn),如果三秒內(nèi)不resolve,分享會(huì)使用上面?zhèn)魅氲哪J(rèn)參數(shù)2、onShareTimeline()回調(diào)函數(shù)onShareTimeline()回調(diào)函數(shù)監(jiān)聽右上角菜單“分享到朋友圈”按鈕的行為,并自定義分享內(nèi)容。onShareTimeline()回調(diào)函數(shù)沒有參數(shù),但是需要返回一個(gè)Object,用于自定義分享的內(nèi)容,這個(gè)Object的屬性及其含義如表:序號(hào)屬性名類型說明1titlestring自定義標(biāo)題,即朋友圈列表頁(yè)上顯示的標(biāo)題。默認(rèn)值:當(dāng)前小程序名稱。2querystring自定義頁(yè)面路徑中攜帶的參數(shù),如path?a=1&b=2的“?”后面部分。默認(rèn)值:當(dāng)前頁(yè)面路徑攜帶的參數(shù)。3imageUrlstring自定義圖片路徑,可以是本地文件或者網(wǎng)絡(luò)圖片。支持PNG及JPG,顯示圖片長(zhǎng)寬比是1:1。7.2.2分享/轉(zhuǎn)發(fā)小程序頁(yè)面內(nèi)的信息1、使用wx.showShareImageMenu(Objectobject)分享圖片使用wx.showShareImageMenu(Objectobject)函數(shù)打開分享圖片彈窗,可以將圖片發(fā)送給朋友、收藏或下載。它接受一個(gè)Object對(duì)象參數(shù),這個(gè)對(duì)象參數(shù)的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1pathstring無(wú)是要分享的圖片地址,必須為本地路徑或臨時(shí)路徑2stylestring'default'否分享樣式,可選v23needShowEntrancestringfalse否分享的圖片消息是否要帶小程序入口(僅部分小程序類目可用)4entrancePathstring‘’否從消息小程序入口打開小程序的路徑,如果當(dāng)前頁(yè)面允許分享給朋友,則默認(rèn)為當(dāng)前頁(yè)面路徑,否則默認(rèn)為小程序首頁(yè)5successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。6failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。7completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)2、使用wx.shareVideoMessage(Objectobject)轉(zhuǎn)發(fā)視頻使用wx.shareVideoMessage(Objectobject)函數(shù)轉(zhuǎn)發(fā)視頻到聊天。它接受一個(gè)Object對(duì)象參數(shù),這個(gè)對(duì)象參數(shù)的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1videoPathstring無(wú)是要分享的視頻地址,必須為本地路徑或臨時(shí)路徑2thumbPathstring無(wú)否縮略圖路徑,若留空則使用視頻首幀3successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。4failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。5completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)7.2.3分享/轉(zhuǎn)發(fā)API應(yīng)用舉例下面通過一個(gè)簡(jiǎn)單的程序演示分享/轉(zhuǎn)發(fā)API的應(yīng)用。在這個(gè)示例程序的頁(yè)面中,顯示一段介紹性文字和一張風(fēng)景圖片,用戶可以將整個(gè)小程序頁(yè)面分享給其他人,也可以使用將頁(yè)面中的圖片分享/轉(zhuǎn)發(fā)給其他人。為此,新建名稱為mini-ch07-02的小程序,新建images目錄,并在images目錄下放置一張風(fēng)景圖片。然后修改index.xwml為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><viewclass="container"><textstyle="margin-bottom:20px;">美圖欣賞和分享。好東西是要分享的,分享是一種境界,也是一種選擇。這個(gè)例子演示了如何使用微信小程序的分享和轉(zhuǎn)發(fā)API進(jìn)行信息的分享和轉(zhuǎn)發(fā)。</text><imagesrc="../../images/04.jpg"bind:tap="tapToShare"></image><text>這是一幅在某個(gè)地方拍攝的風(fēng)景圖像,漂亮極了,你可以點(diǎn)擊這個(gè)圖像將圖像分享給你喜歡的人,或者喜歡這張圖片的人。</text><buttonopen-type="share"type="primary">點(diǎn)擊按鈕分享</button></view></scroll-view>修改index.js文件為如下內(nèi)容://index.jsPage({tapToShare(){wx.showShareImageMenu({path:'../../images/04.jpg'});},onShareAppMessage(obj){return{title:'美圖賞析',path:'/pages/index/index.wxml'}},onShareTimeline(){return{title:'美圖賞析',imageUrl:'../../images/04.jpg'}}})運(yùn)行這個(gè)程序,顯示如圖所示的界面:7.3設(shè)備API微信小程序提供了操作手機(jī)設(shè)備的API,包括:經(jīng)典藍(lán)牙操作API、低功耗藍(lán)牙操作API、NFC讀寫操作API、Wi-Fi操作API、屏幕操作API、鍵盤操作API、掃碼API、振動(dòng)API等。本節(jié)對(duì)常用的掃碼API和振動(dòng)API進(jìn)行介紹,對(duì)于其他類型的設(shè)備操作,請(qǐng)閱讀微信小程序相關(guān)文檔。7.3.1掃碼API函數(shù)wx.scanCode(Objectobject)將喚起客戶端掃碼界面進(jìn)行掃碼,并得到掃碼結(jié)果。它接受一個(gè)Object對(duì)象參數(shù),這個(gè)對(duì)象參數(shù)的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1onlyFromCamerabooleanfalse否是否只能從相機(jī)掃碼,不允許從相冊(cè)選擇圖片。2scanTypeArray.<string>['barCode','qrCode']否掃碼類型。可選值:barCode,一維碼;qrCode,二維碼;datamatrix,DataMatrix碼;pdf417,PDF417條碼。3successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。該函數(shù)會(huì)接受到一個(gè)Object對(duì)象參數(shù),該對(duì)象參數(shù)的屬性及其含義如表7-14所示。4failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。5completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)當(dāng)wx.scanCode(Objectobject)成功掃碼后會(huì)調(diào)用success屬性指定的回調(diào)函數(shù),此時(shí),該回調(diào)函數(shù)會(huì)接受到一個(gè)Object類型的對(duì)象參數(shù),該參數(shù)的屬性及其含義如表:序號(hào)屬性名類型含義1resultstring所掃碼的內(nèi)容2scanTypestring所掃碼的類型??赡苤担篞R_CODE,二維碼;AZTEC,一維碼;CODABAR,一維碼;CODE_39,一維碼;CODE_93,一維碼;CODE_128,一維碼;DATA_MATRIX,二維碼;WX_CODE,二維碼;CODE_25,一維碼等。3charSetstring所掃碼的字符集4pathstring當(dāng)所掃的碼為當(dāng)前小程序二維碼時(shí),會(huì)返回此字段,內(nèi)容為二維碼攜帶的path5rawDatastring原始數(shù)據(jù),base64編碼7.3.2震動(dòng)控制API微信提供了兩個(gè)振動(dòng)控制API:wx.vibrateShort(Objectobject)函數(shù),用于正東手機(jī)15ms;wx.vibrateLong(Objectobject)函數(shù),用于振動(dòng)手機(jī)400ms。它們都接受一個(gè)Object對(duì)象參數(shù),其中,wx.vibrateShort(Objectobject)函數(shù)的參數(shù)屬性及其含義如表所示;wx.vibrateLong(Objectobject)函數(shù)的參數(shù)屬性及其含義如表。wx.vibrateShort(Objectobject)函數(shù)參數(shù)Object對(duì)象的屬性及其含義:序號(hào)屬性名類型默認(rèn)值必填說明1typestring無(wú)是震動(dòng)強(qiáng)度類型,有效值為:heavy、medium、light2successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。3failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。4completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)wx.vibrateLong(Objectobject)函數(shù)參數(shù)Object對(duì)象的屬性及其含義:序號(hào)屬性名類型默認(rèn)值必填說明1successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。2failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。3completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)7.3.3設(shè)備API使用舉例下面編寫一個(gè)例子來(lái)介紹設(shè)備API的具體使用。在這個(gè)例子的首頁(yè)面有一個(gè)按鈕,點(diǎn)擊這個(gè)按鈕,啟動(dòng)微信小程序掃碼功能,當(dāng)成功掃碼后,將振動(dòng)手機(jī),同時(shí)在按鈕下方顯示掃碼結(jié)果。為此,新建名稱為mini-ch07-03的小程序工程,修改index.wxml文件為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><view><buttontype="primary"bind:tap="scan">掃碼</button><viewwx:if="{{sr!=''}}"style="margin:70px;">{{sr}}</view></view></scroll-view>修改index.js為如下內(nèi)容://index.jsPage({data:{sr:''},scan(){letthat=this;wx.scanCode({success(res){wx.vibrateLong();console.log(res);that.setData({sr:res.result})}});}})可以在微信模擬器或者在手機(jī)上運(yùn)行這個(gè)程序。當(dāng)在手機(jī)上運(yùn)行時(shí),可以通過相機(jī)掃碼,并在頁(yè)面按鈕下方顯示掃碼結(jié)果;當(dāng)在模擬器上運(yùn)行時(shí),可以掃碼某張包含二維碼的圖片,讓后在按鈕下方顯示掃碼結(jié)果。如圖是程序在模擬器上運(yùn)行時(shí)的首頁(yè)面,點(diǎn)擊掃掃碼按鈕,可選擇某個(gè)包含二維碼的圖片進(jìn)行掃碼:7.4微信開放接口API微信平臺(tái)提供了一組接口,使得微信小程序可以使用微信的基本功能,包括獲取微信用戶的基本信息、微信用戶登錄并獲得唯一憑證、功能授權(quán)等。本節(jié)對(duì)典型和常用的微信開放接口進(jìn)行介紹。先從獲取微信用戶基本信息開始。7.4.1獲取用戶頭像avatar信息在新版的微信小程序開放接口API中,已經(jīng)收回了wx.getUserInfo函數(shù)(也就是這個(gè)函數(shù)不再被支持);同時(shí),wx.getUserProfile(Objectobject)函數(shù)只能獲取一個(gè)通用默認(rèn)的用戶頭像avatar地址和名稱為“微信用戶”默認(rèn)用戶昵稱,因此,wx.getUserProfile(Objectobject)函數(shù)不再提供具有實(shí)質(zhì)參考價(jià)值的信息;但是有時(shí)為了有較好的用戶體驗(yàn),需要在小程序中獲取用戶的頭像,為此,可以使用button組件并指定其open-type屬性為“chooseAvatar”來(lái)實(shí)現(xiàn)這個(gè)功能。使用button組件獲取用戶頭像的具體過程如下:在頁(yè)面中放置button組件,指定該組件的open-type屬性為“chooseAvatar”,并設(shè)置該組件的bindchooseavatar屬性指向回調(diào)函數(shù)。在回調(diào)函數(shù)中,函數(shù)事件參數(shù)e的屬性e.detail.avatarUrl就是頭像臨時(shí)文件鏈接地址。下面舉一個(gè)例子演示如何獲取用戶頭像。在這例子中,用戶點(diǎn)擊程序首頁(yè)面上的“獲取用戶頭像”按鈕即可在按鈕下面的組件中顯示用戶的頭像。為此,先建立名稱為mini-ch07-04的小程序工程,修改index.wxml文件為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><viewclass="container"><buttonopen-type="chooseAvatar"type="primary"
bind:chooseavatar="chooseavatar">獲取用戶頭像</button><imagewx:if="{{avatar}}!=''"src="{{avatar}}"></image></view></scroll-view>在index.js文件中,編寫chooseavatar回調(diào)函數(shù)代碼。修改后的index.js如下://index.jsPage({data:{avatar:''},chooseavatar(e){this.setData({avatar:e.detail.avatarUrl})}})運(yùn)行這個(gè)程序,顯示如圖所示的首頁(yè)面:7.4.2小程序登錄目前各種前端應(yīng)用程序?yàn)榱送瓿梢欢ǖ臉I(yè)務(wù)功能都需要后臺(tái)服務(wù)端程序的支持。后臺(tái)服務(wù)程序?yàn)榱藴?zhǔn)確的為用戶提供服務(wù),需要了解每個(gè)用戶的身份,也就是,代表用戶的各種前端程序需要在服務(wù)端唯一的標(biāo)識(shí)自己以與其他用戶區(qū)分。為此,每個(gè)小程序用戶在服務(wù)端需要一個(gè)能夠唯一標(biāo)識(shí)自己的編號(hào)。小程序登錄功能可為每個(gè)小程序及每個(gè)用戶生成一個(gè)唯一的標(biāo)識(shí)碼。小程序登錄wx.login(Objectobject)函數(shù)只會(huì)返回一個(gè)有效期為5分鐘的登錄憑證。為了獲取唯一標(biāo)識(shí)碼,小程序需要將這個(gè)憑證發(fā)送到后臺(tái)服務(wù)器程序,后臺(tái)服務(wù)器程序再通過訪問如下網(wǎng)絡(luò)服務(wù)API獲得用戶唯一標(biāo)識(shí)號(hào):GET/sns/jscode2session也就是通過HTTP的GET方法訪問這個(gè)特定的鏈接方可獲取用戶唯一標(biāo)識(shí)號(hào)。訪問這個(gè)鏈接時(shí),需要提供如表:jscode2session鏈接訪問參數(shù)及其含義:訪問這個(gè)鏈接后,微信平臺(tái)返回一個(gè)JSON數(shù)據(jù)對(duì)象,這個(gè)JSON數(shù)據(jù)對(duì)象的屬性及其含義如表:序號(hào)參數(shù)名類型必填說明1appidstring是小程序appId2secretstring是小程序appSecret3js_codestring是登錄時(shí)獲取的code,可通過wx.login獲取4grant_typestring是授權(quán)類型,此處只需填寫authorization_code序號(hào)屬性名類型說明1session_keystring會(huì)話密鑰。可以使用這個(gè)key對(duì)數(shù)據(jù)加密從而確保數(shù)據(jù)通信安全。2unionidstring用戶在開放平臺(tái)的唯一標(biāo)識(shí)符,若當(dāng)前小程序已綁定到微信開放平臺(tái)賬號(hào)下才會(huì)返回這個(gè)值。3openidstring用戶唯一標(biāo)識(shí)。這個(gè)就是能夠唯一標(biāo)識(shí)用戶的標(biāo)識(shí)號(hào)。4errmsgstring錯(cuò)誤信息5errcodeint32錯(cuò)誤碼觀察訪問jscode2session鏈接時(shí)的參數(shù),發(fā)現(xiàn)里面有兩個(gè)特別的參數(shù):appid和secret,這兩個(gè)是什么參數(shù)?如何獲得這兩個(gè)參數(shù)值呢?回顧一下在微信開發(fā)工具中新建微信小程序時(shí)的界面,如圖:為了能夠使得小程序可以登錄微信平臺(tái)并獲取唯一的用戶標(biāo)識(shí)號(hào),需要正常注冊(cè)后才能夠調(diào)用wx.login(Objectobject)函數(shù)。為此,點(diǎn)擊圖箭頭2所指向的“注冊(cè)”鏈接打開小程序注冊(cè)頁(yè)面,如圖:按圖所示的過程和說明注冊(cè)一個(gè)微信小程序賬號(hào)。注冊(cè)成功后,用注冊(cè)的賬號(hào)登錄微信進(jìn)入小程序管理頁(yè)面,點(diǎn)擊左側(cè)功能區(qū)的“開發(fā)管理”鏈接,進(jìn)入如圖:即可看到已經(jīng)注冊(cè)的賬號(hào)所分配的AppID和AppSecret?;谏厦娴慕榻B,在注冊(cè)了微信小程序賬號(hào)并且獲得了AppID和AppSecret以后,就可以訪問jscode2session鏈接獲得用戶唯一的標(biāo)識(shí)號(hào),服務(wù)端將這個(gè)唯一的用戶標(biāo)識(shí)號(hào)發(fā)給小程序,并且在小程序每次訪問服務(wù)端程序時(shí)都攜帶這個(gè)標(biāo)識(shí)號(hào),后臺(tái)服務(wù)程序即可準(zhǔn)確識(shí)別不同的用戶,從而為用戶提供精確的服務(wù)。在編寫例子程序之前,先介紹一下wx.login(Objectobject)函數(shù)的參數(shù)屬性及其含義。wx.login(Objectobject)函數(shù)的Object對(duì)象的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1timeoutnumber無(wú)否超時(shí)時(shí)間,單位ms2successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。成功后會(huì)傳遞一個(gè)Object對(duì)象參數(shù),該對(duì)象參數(shù)的屬性及其含義如下:code,string,用戶登錄憑證(有效期五分鐘)。開發(fā)者需要在開發(fā)者服務(wù)器后臺(tái)調(diào)用code2Session,使用code換取openid、unionid、session_key等信息。3failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。4completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)下面編寫一個(gè)程序,通過登錄獲取用戶唯一的openid標(biāo)識(shí)碼和session_key數(shù)據(jù)。為此,首先新建一個(gè)名為mini-ch07-05的小程序工程,修改inex.wxml為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black“background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><viewclass="container"><buttonbind:tap="tap">登錄</button><text>openid:</text><text>{{openid}}</text><text>session_key:</text><text>{{session_key}}</text></view></scroll-view>修改index.js為如下內(nèi)容://index.jsPage({data:{openid:'',session_key:''},tap(){letthat=this;wx.login({success(res){if(res.code){console.log("logincode:")console.log(res.code);wx.request({url:'29:8080/login/openid',data:{js_code:res.code,grant_type:'authorization_code'},success:function(e){that.setData({openid:e.data.openid,session_key:e.data.session_key});console.log(e.data)//res.data中有openid},fail(e){console.log(e);}})}else{console.log('登錄失敗!'+res.errMsg)}}});}})注意,其中wx.request()函數(shù)中的url地址是服務(wù)器地址。為此,在服務(wù)端采用SpringMVC編寫如下所示的Controller:packagecom.ttt.wxserver;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;
@RestControllerpublicclassWXOpenIdController{@GetMapping("/login/openid")publicStringgetWXOpenId(@RequestParamStringjs_code,@RequestParamStringgrant_type){Stringurl="/sns/jscode2session?"+"appid=填寫自己的AppID&"+"secret=填寫自己的AppSecret&"+"js_code="+js_code+"&"+"grant_type=authorization_code";RestTemplateclient=newRestTemplate();Stringbody=client.getForEntity(url,String.class).getBody();System.out.println(body);returnbody;}}運(yùn)行這個(gè)程序,顯示如圖所示的首界面,點(diǎn)擊“登錄”按鈕,程序?qū)⒌卿洸@取小程序用戶唯一標(biāo)識(shí)號(hào)openid和session_key,如圖:7.4.3授權(quán)和設(shè)置微信小程序的部分接口API需要經(jīng)過用戶授權(quán)同意才能調(diào)用,微信把這些接口按使用范圍分成多個(gè)scope。當(dāng)小程序首次調(diào)用需要授權(quán)才可以正常調(diào)用的微信API函數(shù)時(shí),微信客戶端會(huì)彈窗詢問用戶是否允許小程序調(diào)用該API:如果用戶選擇授權(quán),小程序后臺(tái)會(huì)記住此次授權(quán)操作,在本次及以后的類似調(diào)用中不再?gòu)棿霸儐?,而是直接允許調(diào)用該API;如果用戶拒絕授權(quán),小程序后臺(tái)也會(huì)記住此次授權(quán)操作,在本次及以后的類似調(diào)用中不再?gòu)棿霸儐?,而是直接調(diào)用該API參數(shù)對(duì)象的fail屬性所指定的回調(diào)函數(shù)。微信權(quán)限scope及其對(duì)應(yīng)接口API如表:序號(hào)scope對(duì)應(yīng)接口名稱說明1scope.userLocationwx.getLocation,wx.startLocationUpdate精確地理位置2scope.userFuzzyLocationwx.getFuzzyLocation模糊地理位置3scope.userLocationBackgroundwx.startLocationUpdateBackground后臺(tái)定位4scope.recordlive-pusher組件wx.startRecordwx.joinVoIPChatRecorderManager.start麥克風(fēng)5scope.cameracamera組件,live-pusher組件wx.createVKSession攝像頭6scope.bluetooth wx.openBluetoothAdapterwx.createBLEPeripheralServer藍(lán)牙7scope.writePhotosAlbumwx.saveImageToPhotosAlbumwx.saveVideoToPhotosAlbum添加到相冊(cè)8scope.addPhoneContactwx.addPhoneContact 添加到聯(lián)系人9scope.addPhoneCalendarwx.addPhoneRepeatCalendarwx.addPhoneCalendar添加到日歷10scope.werunwx.getWeRunData微信運(yùn)動(dòng)步數(shù)除了可以借助微信客戶端的彈窗功能授權(quán)/拒絕授權(quán)小程序使用微信特定API和功能外,還可以使用小程序的wx.authorize(Objectobject)函數(shù)提前向用戶發(fā)起授權(quán)請(qǐng)求。調(diào)用后會(huì)立刻彈窗詢問用戶是否同意授權(quán)小程序使用某項(xiàng)功能或獲取用戶的某些數(shù)據(jù),但不會(huì)實(shí)際調(diào)用對(duì)應(yīng)接口。如果用戶之前已經(jīng)同意授權(quán),則不會(huì)出現(xiàn)彈窗,直接返回成功。wx.authorize(Objectobject)函數(shù)的Object兌現(xiàn)參數(shù)的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1scopestring無(wú)是需要獲取權(quán)限的scope,詳見scope列表,如表7-20所示。2successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。3failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。4completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)為了了解對(duì)某個(gè)小程序的授權(quán)情況及其對(duì)權(quán)限進(jìn)行控制,用戶可以在小程序設(shè)置界面中查看及控制對(duì)該小程序的授權(quán)狀態(tài),如圖:小程序則可以通過調(diào)用wx.getSetting(Objectobject)函數(shù)獲取用戶的當(dāng)前權(quán)限設(shè)置。該函數(shù)接受一個(gè)Object對(duì)象參數(shù),該Object對(duì)象參數(shù)的屬性及其含義如表:序號(hào)屬性名類型默認(rèn)值必填說明1withSubscriptionsBooleanfalse否是否同時(shí)獲取用戶訂閱消息的訂閱狀態(tài),默認(rèn)不獲取。2successfunction無(wú)否接口調(diào)用成功的回調(diào)函數(shù)。當(dāng)成功時(shí),傳遞一個(gè)Object對(duì)象作為參數(shù),該對(duì)象的屬性及其屬性如下:authSetting,AuthSetting,用戶授權(quán)結(jié)果;subscriptionsSetting,SubscriptionsSetting 用戶訂閱消息設(shè)置,接口參數(shù)withSubscriptions值為true時(shí)才會(huì)返回。其中,AuthSetting對(duì)象類型包含授權(quán)scope,當(dāng)對(duì)應(yīng)的scope屬性為true時(shí)表示已經(jīng)授權(quán)此scope,否則表示沒有授權(quán)該scope。3failfunction無(wú)否接口調(diào)用失敗的回調(diào)函數(shù)。4completefunction無(wú)否接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)7.5案例:在線相冊(cè)用照片記錄美好瞬間并把這些照片妥善保存起來(lái)是一件很愜意的事。本案例程序?qū)崿F(xiàn)一個(gè)簡(jiǎn)單的在線相冊(cè),每個(gè)用戶可以創(chuàng)建自己的相冊(cè),并用該相冊(cè)保存自己的照片。7.5.1案例目標(biāo)編寫一個(gè)微信小程序,實(shí)現(xiàn)個(gè)人相冊(cè)功能,具體包括:1、每個(gè)用戶可以擁有自己的相冊(cè),并且不同用戶之間的相冊(cè)不能混淆;2、用戶可以查看自己相冊(cè)的照片;3、用戶可以增加新的照片到相冊(cè);4、用戶可以刪除自己相冊(cè)中的某張照片。7.5.2案例分析為了實(shí)現(xiàn)個(gè)人相冊(cè)并對(duì)每個(gè)用戶的照片進(jìn)行管理,顯然,需要一個(gè)后臺(tái)服務(wù)器程序。在后臺(tái)服務(wù)器程序中,可以基于用戶的openid為每個(gè)小程序用戶建立一個(gè)獨(dú)立的相冊(cè)目錄,然后將該用戶的所有照片保存到該目錄中。為此,需要完成如下編碼工作:1、 實(shí)現(xiàn)一個(gè)后臺(tái)服務(wù)系統(tǒng),實(shí)現(xiàn)照片的管理工作。本案例采用SpringMVC實(shí)現(xiàn)后臺(tái)服務(wù)系統(tǒng)。在服務(wù)端程序中,基于用戶的openid為每個(gè)用戶創(chuàng)建一個(gè)唯一的存放用戶照片的目錄。2、 實(shí)現(xiàn)前端小程序,完成照片的顯示、上傳、刪除等功能。7.5.3案例實(shí)施先編寫后臺(tái)服務(wù)程序。建立SpringMVC工程,在工程中新建一個(gè)名為PhotoController的控制器程序,實(shí)現(xiàn)上傳照片、獲取所有照片列表、獲取指定照片、刪除指定照片的功能。PhotoController.java代碼如下:importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;importorg.springframework.web.multipart.MultipartFile;
importjava.io.*;import.URLEncoder;importjava.nio.charset.StandardCharsets;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;@RestControllerpublicclassPhotoController{@GetMapping("/login")publicStringgetWXOpenId(@RequestParamStringjs_code,@RequestParamStringgrant_type){Stringurl="/sns/jscode2session?"+"appid=自己的AppID&"+"secret=自己的AppSecret&"+"js_code="+js_code+"&"+"grant_type="+grant_type;RestTemplateclient=newRestTemplate();Stringbody=client.getForEntity(url,String.class).getBody();System.out.println(body);returnbody;}
@GetMapping("/list")publicArrayList<String>getPhotoList(@RequestParamStringopenid,HttpServletRequestreq){Stringpath="C:/Wu/photos/"+openid;Filef=newFile(path);if(!f.exists())returnnull;
String[]ns=f.list();if(ns==null)returnnull;Stringscheme=req.getScheme();Stringip=req.getLocalAddr();intport=req.getLocalPort();Stringcp=req.getContextPath();ArrayList<String>pl=newArrayList<>();for(Stringname:ns){Stringlink=scheme+"://"+ip+":"+port+"/"+cp+"photo?"+"id="+name+"&openid="+openid;pl.add(link);}returnpl;}
@GetMapping("/photo")publicbyte[]getPhotoById(@RequestParamStringopenid,@RequestParamStringid,HttpServletResponseresponse)throwsIOException{Stringpath="C:/Wu/photos/"+openid+"/"+id;Filef=newFile(path);if(!f.exists())returnnull;
byte[]photo=newbyte[(int)f.length()];FileInputStreamfis=newFileInputStream(f);if(fis.read(photo)<=0)returnnull;fis.close();
response.setContentType("image/jpeg");response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(id+".jpg",StandardCharsets.UTF_8));returnphoto;}
@PostMapping("/upload")publicvoiduploadPhoto(@RequestParam
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務(wù)支付安全與風(fēng)險(xiǎn)管理(標(biāo)準(zhǔn)版)
- 煙草專賣管理制度與實(shí)施指南
- 供應(yīng)商選擇與評(píng)估管理制度制度
- 公共交通車輛維修質(zhì)量管理制度
- 義翹講堂《Tau的結(jié)構(gòu)?修飾?致?。簭幕A(chǔ)功能到神經(jīng)退行性疾病的診斷與治療突破》
- 2026年順德區(qū)環(huán)城小學(xué)招聘語(yǔ)文臨聘教師備考題庫(kù)參考答案詳解
- 2026年江蘇省東??h部分事業(yè)單位赴高校公開招聘高層次人才8人備考題庫(kù)及完整答案詳解一套
- 養(yǎng)老院日常照護(hù)制度
- 2026年西昌市房地產(chǎn)事務(wù)中心招聘2名工作人員備考題庫(kù)及參考答案詳解一套
- 天津市濱海新區(qū)2026年事業(yè)單位公開招聘工作人員備考題庫(kù)及參考答案詳解一套
- 幼兒園消防安全管理細(xì)則解讀
- 沈陽(yáng)市2025遼寧沈陽(yáng)市于洪區(qū)社區(qū)殘疾人工作專職干事招聘筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 2026年內(nèi)蒙古電子信息職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)附答案詳解
- 2025年綿陽(yáng)市中考英語(yǔ)試題(附答案)
- 中華人民共和國(guó)公務(wù)員法(2025年修正)
- DB3711∕T 129-2023 露天礦山生態(tài)修復(fù)驗(yàn)收規(guī)范
- 四川省德陽(yáng)市第五中學(xué)2025-2026學(xué)年上學(xué)期八年級(jí)數(shù)學(xué)第一次月考試題(無(wú)答案)
- (英語(yǔ))高一英語(yǔ)完形填空專題訓(xùn)練答案
- 公安副職競(jìng)聘考試題庫(kù)及答案
- 口腔診所勞務(wù)合同協(xié)議書
- 2025年度商鋪裝修工程總包與施工合同
評(píng)論
0/150
提交評(píng)論