1. 程式人生 > >安卓前端如何與.net後端通訊(一)

安卓前端如何與.net後端通訊(一)

今天在公司工作,由於專案人手不夠,後端是使用.net開發的,然後一個寫交換的哥們不知道如何下手。

剛開始,我也是狗吃王八無從下口。

回想一下以前做的開發,任何與後端的通訊,無非就是找到後端的相應路徑,然後加上對應的引數,就能完成對應的功能。

例如:

一、在瀏覽器中,用百度搜索123的結果。

如圖:

從上面的圖片中可以看到,web前端和後端的資料互動後的結果無非就是一段地址:

https://www.baidu.com/s?wd=123

從上面的地址中,我們可以看到,所謂的前端和後端通訊,就是:網路地址+對應引數,百度這裡就是

new String("https://www.baidu.com/s?wd="+"123");
後面的那個“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);}});}} 具體的東西就是上面這樣了,但是更詳細暫時沒有那麼的能力講解的那麼透徹,留待以後剖析