安卓前端如何與.net後端通訊(一)
阿新 • • 發佈:2018-12-31
今天在公司工作,由於專案人手不夠,後端是使用.net開發的,然後一個寫交換的哥們不知道如何下手。
剛開始,我也是狗吃王八無從下口。
回想一下以前做的開發,任何與後端的通訊,無非就是找到後端的相應路徑,然後加上對應的引數,就能完成對應的功能。
例如:
一、在瀏覽器中,用百度搜索123的結果。
如圖:
從上面的圖片中可以看到,web前端和後端的資料互動後的結果無非就是一段地址:
https://www.baidu.com/s?wd=123
從上面的地址中,我們可以看到,所謂的前端和後端通訊,就是:網路地址+對應引數,百度這裡就是
後面的那個“123”就是所謂的變數,也就是我們想要百度搜索的內容,而通過瀏覽器瀏覽器把這個網路地址解析出來後,就是呈現在我們面前的內容。new String("https://www.baidu.com/s?wd="+"123");
同理,可得:我們安卓開發中,我們想和伺服器通訊,那麼首先我們也需要知道伺服器的地址,然後我們發起網路訪問的請求,把我們想搞的東西寫到引數中,傳遞給伺服器,那麼伺服器只要有對應的方法來解析,我們就能達到預期的目標。
二、安卓客戶端,往伺服器傳送圖片。
首先,我們前面講過了原理。那麼我們明白,前端(安卓)要想往伺服器傳檔案,伺服器得有對應的方法來解決我們的檔案接收,而且檔案我們要作為資料先發過去。
let's go。
首先,我不是怎麼熟悉.net開發,那麼怎麼辦?我們拿出我們java程式設計師最熟悉的,java服務層。具體解決框架,咱不用十分明白。但是我們要看到服務層確實對檔案進行了儲存的。程式碼,如下:
@RequestMapping("upload") @ResponseBody public String upload(Model model, MultipartHttpServletRequest request, His his) { String TMPname = new String(unicode2String(his.getUserName())); MultipartFile file = request.getFile("file"); if (!file.isEmpty()) { // 獲得檔名: String filename = file.getOriginalFilename(); String imgtype = filename.substring(filename.lastIndexOf(".")); String ctxPath = request.getSession().getServletContext() .getRealPath("/") + "upload/"; File dirPath = new File(ctxPath); System.err.println(dirPath.getAbsolutePath()); if (!dirPath.exists()) { dirPath.mkdir(); } File uploadFile = new File(ctxPath + UUID.randomUUID().toString() + imgtype); his.setUserName(TMPname); System.err.println(his.getUserName()); his.setPath(uploadFile.getName()); his.setType("簽到"); try { FileCopyUtils.copy(file.getBytes(), uploadFile); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } getHisServiceImpl().add(his); } return YGGLI_COMMON_PAGE; }
上面就是服務端的圖片接收原始碼,為什麼不用檔案上傳的?畢竟手裡有個現成的圖片上傳。
看完了後端,我們再來看看安卓前端,安卓前端為了減少程式碼量,我用了KJFRAME這個開源框架
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == NONE)
return;
// 拍照
if (requestCode == PHOTO_GRAPH) {
// 設定檔案儲存路徑
File picture = new File(Environment.getExternalStorageDirectory()
+ "/temp.jpg");
KJHttp kjh = new KJHttp();
HttpParams params = new HttpParams();
System.err.println(App.currentUserName.toString() + "::::"
+ string2Unicode(App.currentUserName.toString()));
params.put("userId", App.currentUserId.toString());<span style="white-space:pre"> </span>//新增使用者ID
params.put("userName",<span style="white-space:pre"> </span>//使用者名稱
string2Unicode(App.currentUserName.toString()));
params.put("gps", gps);<span style="white-space:pre"> </span>//GPS資訊
try {
params.put("file", picture);<span style="white-space:pre"> </span>//加入檔案
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
kjh.post(App.url + "hisAction/upload.do", params,<span style="white-space:pre"> </span>//伺服器提供的介面為<span style="font-family: Arial, Helvetica, sans-serif;">App.url + "hisAction/upload.do"</span>
<span style="white-space:pre"> </span><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">//這就是前面說的伺服器提供的檔案儲存的方法,也就是瀏覽器中的地址</span>
//params是我們要傳給伺服器的引數new HttpCallBack() {@Overridepublic void onSuccess(String t) {super.onSuccess(t);ViewInject.toast("檔案上傳完成");Toast.makeText(CMainActivity.this, "上傳簽到記錄成功!", 3).show();}@Overridepublic void onFailure(Throwable t, int errorNo,String
strMsg) {super.onFailure(t, errorNo, strMsg);ViewInject.toast("檔案上傳失敗" + strMsg);}});}}
具體的東西就是上面這樣了,但是更詳細暫時沒有那麼的能力講解的那麼透徹,留待以後剖析