프로그래밍/안드로이드

[Android] 안드로이드 플랫폼에서 HTTP POST 요청 처리하기 ( XML 파싱 )

가카리 2013. 11. 18. 22:38
반응형

안드로이드 플랫폼 HttpPost 요청 처리 구현

(XmlPullParser) 

안드로이드 플랫폼에서 Http 요청을 보내서 값을 받아오는 방법중 

HttpPost, HttpGet, 방식이 있는데, 쓰는방법은 비슷하다.

아무래도 왠만하면 Post 방식을 쓰는게 좋지 않을까 싶다.


예제 구현 방법은 

간단하게 값 2개를  "euc-kr" 로 인코딩해서 Vector에 집어넣고, JSP Page로 보내서 

JSP 페이지에서 지지고 볶은 다음, 안드로이드로 보낼 값들을 XmlPullParser로 받을수있게,

xml 형식으로 내뿜으면

알아서 String 으로 return 됩니다.

그후 리턴값을 XMLPullParser에 집어넣어서 파싱합니다.

 





구현순서 

1. 요청에 필요한 값들을 BasicNameValuePair 형식(key, value)으로 Vector 에 집어넣는다.


2. Vector 를 HttpEntity 생성후 넣는다.


3. HttpPost 인스턴스 생성후 2번에서 만든 HttpEntity 를 .setEntity 한다.(HttpPost 생성시에 생성자로 url을 넣는다)


4. HttpClient 생성후 execute(HttpPost, ResponseHandler) 메소드를 이용해서 요청 날린다.(return 값은 String Type)


5. 리턴 받은 String을 XmlPullParser 생성후  .setInput(new StringReader(결과String))



글 재주가 없어서, 구현순서 설명이 그지같이 됐는데, 

코드를 보면 아주 간단합니다. 

대충 뚝딱뚝딱 하면 잘~ 동작합니다.

(한글 작업이 필요거나, DB에 저장할 때, 형식에 맞게 인코딩 해주면 된다. 2번에서)




이제부터 보실 코드는 위 설명을 읽으신후 보시면

아~~주 간단합니다.

HttpPost 구현이 필요하신분은, 코드를 죽~~ 긁어서 그냥 갔다 쓰시면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
`  
    private String sendData(String number, String input) throws Exception {
 
        HttpPost request = makeHttpPost(number, input, uri);
 
        HttpClient client = new DefaultHttpClient();
         
        ResponseHandler reshandler = new BasicResponseHandler();
         
        String result = client.execute(request, reshandler);
         
        return result;
 
    }
    

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

4라인에서 값 2개와 uri 를 makeHttpPost() 로 보내서 request 를 만든후 

client 를 이용해서 execute 하면 String 으로 리턴됩니다. 




makeHttpPost 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`  
    private HttpPost makeHttpPost(String number, String input,
                                    String url) throws Exception {
         
        HttpPost request = new HttpPost(url);
         
        Vector<basicnamevaluepair> nameValue = new Vector<basicnamevaluepair>();
         
        nameValue.add(new BasicNameValuePair("NUMBER", number));
        nameValue.add(new BasicNameValuePair("INPUT", input));
         
        request.setEntity( makeEntity(nameValue) );
         
        return request;
    }
 
</basicnamevaluepair></basicnamevaluepair>

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

17라인은 무시하세요..ㅠㅠ 저거 자동으로 태그닫는거 없애는거 아시는분좀 갈켜주세요

12라인에서  request 에   makeEntity()를 이용해서 HttpEntity 를 만들면서 집어넣습니다.

 


makeEntity 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`      
    private HttpEntity makeEntity(Vector<basicnamevaluepair> nameValue)
                                                    throws Exception {
        HttpEntity result = null;
         
        try {
             
            result = new UrlEncodedFormEntity(nameValue, "euc-kr");
             
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
         
        return result;
    }
 
</basicnamevaluepair>



 

이렇게 3개의 메소드를 이용해서 요청에 필요한 작업을 한후,

요청을 하면 uri 에서 요청을 받아들인후 http로 결과값이 뿌려지면 그대로

그 값이 String 으로 담아지게 됩니다.

그냥 어디 홈페이지에 요청을 하게되면, 그 페이지가 쭉 다 긁혀오겠지요

여기까지가 안드로이드 플랫폼에서 HttpPost 를 이용해서 요청한후

결과값 받아오는 모든 과정입니다.

결과값이 그냥 String 으로 하나만 써먹을 경우에는 그냥 쓰면 되겠지만


보통은 여러가지 값을 이용해야 하는데,

그러기 위해서 태그를 써서 XML 형식으로 값을 받은후에

파서로 값을 잘라서 구분한 후 이용해야합니다.  

!! 주의할점은 파싱할 때, 구분이 문자는 '<' 문자이기 때문에,

태그가 열리는 '<' 가 아닌, 내용중에 '<' 가 포함되어 있으면, 파서에서 Exception 이 발생하게됩니다.

그렇기 때문에, XmlPullParser 를 이용하실 때는 내용중에 '<' 기호가 포함되지 않도록, 주의 하셔야 합니다. 
 




XmlPullParser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
`
    XmlPullParserFactory factory = null;
    XmlPullParser xpp = null;
         
    private void search(String input) throws Exception {
         
        factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        xpp = factory.newPullParser();
 
        xpp.setInput(new StringReader(input));
        int eventType = xpp.getEventType();
        String sTag = "";
 
        while (eventType != XmlPullParser.END_DOCUMENT) {
         
            Result_ListBean resultList = null;
             
            switch (eventType) {
             
            case XmlPullParser.START_DOCUMENT:
                break;
             
            case XmlPullParser.END_DOCUMENT:
                break;
             
            case XmlPullParser.START_TAG:
                sTag = xpp.getName();
 
                if (sTag.equals("number")) {
                    eventType = xpp.next();
                    number = xpp.getText();
                } else if (sTag.equals("aim")) {
                    eventType = xpp.next();
                    aim = xpp.getText();
                } else if (sTag.equals("date")) {
                    eventType = xpp.next();
                    date = xpp.getText();
                } else if (sTag.equals("text")) {
                    eventType = xpp.next();
                    text = xpp.getText();
                } else if(sTag.equals("data")) {
                    eventType = xpp.next();
                    DataShare.totalListCount = Integer.parseInt(xpp.getText());
                }
                break;
                 
            case XmlPullParser.END_TAG:
                if (xpp.getName().equals("person")) {
                    resultList = new Result_ListBean(id, number, area1, area2,
                            area3, kind, writer_gender, aim, target_gender,
                            deposit, rent_money, date, text);
                    list.add(resultList);
                }
                break;
                 
            case XmlPullParser.TEXT:
                break;
            }
            eventType = xpp.next();
        }// while end;
                 
    }

 

 

출처 : http://winmargo.tistory.com/125

반응형