아래글에서는 WebView와 웹서버간의 HTTP 통신내용을 모니터링하는 방법을 설명했습니다. 이번에는 Spring-Android 라이브러리를 이용하여 앱과 웹서버간에 REST로 통신하는 경우에 통신 내용을 엿보는 방법입니다.

import org.apache.http.HttpHost;
import org.apache.http.conn.params.ConnRoutePNames;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
...

public class MyRestActivity extends Activity {

  public xxx someMethod() {
  
    RestTemplate restTemplate = new RestTemplate();
    ... ...
    
    if (isDebugMode(this.getApplicationContext())) { 
      HttpComponentsClientHttpRequestFactory factory =
                   (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
      HttpHost proxy = new HttpHost("본인로컬PC의 IP주소", 프록시포트, "http");
      factory.getHttpClient().getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    }

    ... ...
    ResponseEntity<Xxx> result = 
restTemplate.exchange(url, HttpMethod.POST, requestEntity, Xxx.class);
    ... ...
 
  }
}  


아래글에서 지적했듯이 개발자 PC의 IP주소에 localhost나 127.0.0.1 루프백 주소를 쓰면 안됩니다.

이클립스 TCP/IP 모니터 뷰 설정하는 방법은 아래글과 동일합니다.


실제 앱 개발시에는 위와 같이 프록시를 설정한 RestTemplate 인스턴스를 공통모듈단에서 한개만 만들어놓고 재사용하면 됩니다.
 
Posted by 에코지오
,
WebView를 사용하는 앱 개발시 Eclipse의 TCP/IP Monitor를 통해 WebView와 웹서버간의 HTTP 통신내용을 보는 방법을 설명합니다.

1. 프록시 세팅

import myapp.ProxySettings;
...
public class MyWebActivity extends Activity {

   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      
      if (isDebugMode(
this.getApplicationContext())) { 
         ProxySettings.setProxy(this.getApplicationContext(), "본인로컬PC의 IP주소", 프록시포트);
      } 
      ...
      ...
      myWebView.loadUrl("http://웹서버IP:웹서버포트/xxxx.jsp");
   }


웹페이지를 로딩하기 전에 ProxySettings를 통해 프록시를 설정합니다. ProxySettings 클래스는 http://manojtk.blogspot.com/2011/01/android-webview-proxy-setting.html 사이트에서 구할 수 있습니다.

여기서 주의할 점이 2가지가 있습니다.

(1) 개발자 PC의 IP주소에 localhost나 127.0.0.1 루프백 주소를 쓰면 안됩니다. 앱은 PC가 아니라 폰에서 실행되므로 루프백 주소는 폰의 로컬 IP입니다.
(2) 프록시 설정은 실제 마켓에 올라가는(production 환경) 앱에 반영되면 안되므로 개발시점(development 환경)에서만 적용되도록 해야합니다. 위 예제소스에서는 앱이 debug모드로 서명되었는지를 체크하여 프록시를 세팅하고 있습니다.

    private boolean isDebugMode(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0);
            int flags = packageInfo.applicationInfo.flags;
            return (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        } catch (NameNotFoundException e) {
            return true;
        }
    }

    

2. 이클립스에서 TCP/IP 모니터링 설정
 



(1) 이클립스 Preferences 창을 띄웁니다.
(2) TCP/IP Monitor 메뉴를 선택합니다.
(3) Add 버튼을 눌러 모니터를 추가합니다.

* Local monitoring port : 앞서 설정한 프록시 포트
* Host name : 웹서버 IP
* Port : 웹서버 포트

(4) Start 버튼을 눌러 모니터링을 시작합니다.


3. 이클립스에서 TCP/IP Monitor 뷰를 통해 HTTP통신내용 확인
폰에서 폰갭앱을 실행하여 웹페이지를 띄우면 이클립스에서 TCP/IP Monitor뷰가 뜨면서 통신내용을 볼 수 있습니다.

 
Posted by 에코지오
,
jQuery에서 ajax() 함수의 기본 Content-Type은 "application/x-www-form-urlencoded"이므로 전송할 데이터는 query string 형식으로 작성해야 합니다. 쿼리스트링은 "key1=value&key2=value2&…"와 같은 포맷을 갖습니다.

1. form 요소 값들을 query string으로 만들기

$('#폼ID').serialize() 


2. javascript array 객체를 query string으로 만들기

jQuery.param(array객체)


만약 요청 Content-Type을 "application/json" 으로 변경한 경우에는 쿼리스트링이 아니라 json 형식의 스트링으로 데이터를 전송해야 합니다.
form엘리먼트 값들을 json 객체로 만들어주는 방법은 다음 사이트에 다양한 방법이 나와있습니다.


실제 ajax() 함수에서는 json 객체를 스트링 타입으로 바꿔서 대입합니다.
 

JSON.stringify(json객체)


그러나 쿼리스트링 형식이 가능한 상황에서 굳이 json 형식으로 데이터를 보내는 것은 별로 권장하지 않는 듯합니다.
Posted by 에코지오
,