안드로이드, 아이폰에서 서버로 httpClient 를 이용해서 그림파일을 보내고 그 결과값을 받아와야 할 일이 생겼다.
스트링으로 받아오려면 프레임웤에 REST 를 올려서 json 으로 받는게 가장 심플하고 좋겠지만 낼모레 테스트하는 마당에 그러기엔 너무 귀찮고.. 해서 약간 꼼수를 썼다.
서버의 컨트롤러 메소드에서 ModelAndView 를 리턴할때 jsp 페이지를 하나 만들어 두고 그 jsp 페이지에 리턴할 내용만 넘겨주면 된다. 아주 심플하다.
대신 jsp 페이지의 내용엔 오로지 리턴받기 원하는 string 만 들어가야 한다.
예를 들면,
안드로이드에서
ByteArrayOutputStream bos = new ByteArrayOutputStream();
signature.compress(Bitmap.CompressFormat.PNG, 100, bos);String fileName = phoneNo + "_signature" + ".png";String resultString = "";byte[] data = bos.toByteArray();HttpClient httpClient = new DefaultHttpClient();HttpPost postRequest = new HttpPost(URL_ADDRESS + "/registerConfirm.do");ByteArrayBody bab = new ByteArrayBody(data, fileName);MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);Log.e(TAG, "idx : " + idx);Log.e(TAG, "nextTarget : " + nextTarget);Log.e(TAG, "organizationId : " + organizationId);Log.e(TAG, "approvalChecked : " + approvalChecked);Log.e(TAG, "p_Id : " + id);Log.e(TAG, "p_DeliveryNo : " + deliveryNo);Log.e(TAG, "p_ProductionNo : " + productionNo);Log.e(TAG, "p_WaterPress : " + waterPress);Log.e(TAG, "p_Signature : " + bab.getFilename());try {reqEntity.addPart("idx", new StringBody(idx));reqEntity.addPart("nextTarget", new StringBody(nextTarget));reqEntity.addPart("organizationId", new StringBody(organizationId));reqEntity.addPart("approvalChecked", new StringBody(approvalChecked));reqEntity.addPart("p_Id", new StringBody(id));reqEntity.addPart("p_DeliveryNo", new StringBody(deliveryNo));reqEntity.addPart("p_ProductionNo", new StringBody(productionNo));reqEntity.addPart("p_WaterPress", new StringBody(waterPress));reqEntity.addPart("p_Signature", bab);reqEntity.addPart("browserType", new StringBody("2"));postRequest.setEntity(reqEntity);HttpResponse response = httpClient.execute(postRequest);HttpEntity resEntity = response.getEntity();resultString = EntityUtils.toString(resEntity);String[] result = resultString.split("/");String resultString1 = result[0]; // 결과 코드String resultString2 = result[1]; // 2String resultString3 = result[2]; // 브라우저 타입Log.e(TAG, "resultString1 : " + resultString1);Log.e(TAG, "resultString2 : " + resultString2);Log.e(TAG, "resultString3 : " + resultString3);// Log.e(TAG, "resEntity : " + EntityUtils.toString(resEntity));if (resEntity != null) {resEntity.consumeContent();}// Server 의 javascript function 에 파라메터를 넘겨 준다.mWeb.loadUrl("javascript:showProcedureResult(" + resultString1 + ", " + resultString2 + ", " + resultString3 + ");");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(DongyangView.this, "통신오류가 발생했습니다." + "\n" + "다시 시도해 주세요.", Toast.LENGTH_SHORT).show();} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(DongyangView.this, "통신오류가 발생했습니다." + "\n" + "다시 시도해 주세요.", Toast.LENGTH_SHORT).show();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(DongyangView.this, "통신오류가 발생했습니다." + "\n" + "다시 시도해 주세요.", Toast.LENGTH_SHORT).show();}httpClient.getConnectionManager().shutdown();}
이런 식으로 쐈을때
서버의 컨트롤러 메소드에서는
ModelAndView mav = new ModelAndView();mav.setViewName("registerConfirmResult");mav.addObject("result", result);mav.addObject("id", id);mav.addObject("organizationId", organizationId);mav.addObject("approvalChecked", approvalChecked);mav.addObject("approvalResultCode", result.getP_ResultCode());mav.addObject("nextTarget", "FE_CustomerApproval");mav.addObject("idx", idx);mav.addObject("browserType", browserType);mav.addObject("resultCode", resultCode);return mav;
이렇게 던져주면 된다.
이때 registerConfirmResult.jsp 페이지에는
<%String resultCode = request.getParameter("resultCode"); // 결과코드// String resultName = request.getParameter("resultName"); // 결과명String approvalChecked = request.getParameter(""); // 2String browserType = request.getParameter("browserType"); // chrome or safari%>${resultCode}/${approvalChecked}/${browserType}/
이렇게 정의하면 파일 내용은 클라이언트에 넘겨줄 스트링값으로만 세팅된다.
이 jsp 페이지를 안드로이드가 resultString = EntityUtils.toString(resEntity); 부분에서 스트링으로 받아오고 그 내용에서 필요한 부분들을 "/" 으로 split 해서 끊어서 사용한다.
아주 심플하다. 임시방편으로는..
역시 궁하면 통한다고 했던가.. -_-
'Development > Android' 카테고리의 다른 글
안드로이드 WebView 화면에서 전화걸기 오작동 막기. (0) | 2011.09.22 |
---|---|
가로, 세로로 화면 변경될때 설정 유지하기. (0) | 2011.09.20 |
Error generating final archive: Debug Certificate expired (0) | 2011.07.18 |
파티톡 1.0.1 업그레이드. (0) | 2011.02.17 |
목록에서 링크걸기. (0) | 2011.02.09 |