一.序言
應公司要求要求,要用小程序開發一個信息錄入系統。沒辦法只能聽話來填坑。
先介紹一下環境:客戶端——小程序;服務端——java;數據庫——mysql;服務器——centos7
需求:客戶端輸入信息,insert到數據庫,沒錯就是這么一個簡單的小功能,卻為這個請求折騰了大半天
二.開始
先來看一下wx.request的官方文檔:地址如下https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html#wxrequestobject
嗯,咋看之下貌似挺正常的,沒什么問題,想必寫過ajax請求的同學都是一看就明白,這應該是封裝了一下ajax的請求。好了,我們接下來開始填坑…
三.客戶端
為了有一個接口地址,花了一個月時間去買了服務器、注冊了域名、部署了一下、備案…得到了https的合法域名。
首先這個請求的url必須是https,老版本的怎樣不是很清楚,據說可以用http?想辦法弄一個https的域名先。
接着看一下整個請求代碼:
這邊data要寫成json形式大家都知道,但是,如果這樣寫:
我這邊是沒接受到數據,各種報錯,大家可以試試。然后這個json數據呢,要先轉一下格式:
區別就是一個是jsonObj,而這里是json字符串。直接post jsonObj過去,我這里測的是服務端接受直接報錯,各種getxxxxx()都用過,有大佬測試成功的告訴我一下,謝謝。
然后看下面一行,header.這個默認是application/json 嗯,我這樣試了下:
這是請求的數據,可以看到,發送的時候數據還是正常的,然后服務端接收:
結果數據庫顯示:
看了一下log:
中文變成了亂碼。首先看一下mysql的編碼,是utf-8沒錯,mysql的GUI工具Navicat for Mysql 字符集也是UTF-8,以為是linux服務器編碼問題,去看了一下並且改成了utf-8,但亂碼情況依然出現。
接着我不從小程序post,我直接在這個網站頁面上寫個ajax,放個中文數據到json中,post到后台再插入到數據庫看看會不會亂碼:
接着發現只要不是從小程序post的數據,都不會出現亂碼情況,然后log里面顯示,在進入servlet后,接收到小程序post過來的json數據時就變成了亂碼。
由這些推斷出,是在傳輸過程中,編碼不統一導致的。
最后,終於試出了一個,能傳過去值,能接收到不顯示null,不顯示亂碼,服務器不報500的方法,小程序請求就如上面那個請求那樣寫,header這樣寫:
四.服務端
從小程序那邊post過來的是json字符串,請求是這樣的:
可以看到,這里的content-type都是utf-8的編碼,最下面從原來的requestpayload變成了formdata(requestpayload和formdata的區別可以百度),數據也是正確的。
然后服務端應該這樣接收:
上面三行代碼非常重要,防止出現請求跨域的情況,寫了前兩行代碼;防止出現亂碼,跟小程序那邊統一了編碼格式,setContentType成UTF-8
看一下log:
沒問題,再看一下數據庫:
最后,我們看一下小程序返回結果:
可以看到這里的data是我再服務端用out.print返回的結果,同樣沒問題。至此這個問題解決完美了。
五.結語
剛接觸小程序,感覺還是比較坑爹的,網上還有好多其他例子這里就不一一舉例了,要以輸出log為榮,知錯不報為恥..遇到問題先看一下log,經過測試最后一定能找到解決方法。
希望這篇能對同我一樣剛入坑的小伙伴有幫助吧。