Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

Httprequest받는 소스 미투데이같은 네이버 API 구글 API등에 사용 본문

안드로이드/Http

Httprequest받는 소스 미투데이같은 네이버 API 구글 API등에 사용

설.현.아빠 2011. 2. 24. 13:19





 

package com.lucia;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import android.util.Log;
/*
만든이 : 고하나 (고또)
만든 날짜 : 2011.02.16
플랫폼 : 윈도 7 64bit, 이클립스, 안드로이드 SDK(2.1 ver7)
/**/
 
/// HTTP방식으로 데이터를 주고 리퀘스트 받아오는 클래스
/// GET와 POST방식 두가지 다 사용 가능하다.
 
/// 생성자 호출해서 클래스 인스턴스 생성한 다음
/// request ( URL주소, 방식(GET or POST), 변수명+변수값 ) ;
/// 위 함수로  보내고 받을 수 있다.
public class gsHttpRequester
{
/// 리퀘스트 내용을 통채로 저장할 스트링
public String m_request ;
 
/// http방식으로 연결을 유지할 커넥션
static private HttpURLConnection m_con ;
 
/// 세션 유지에 필요한 쿠키
static String m_cookies = "" ;
 
/// 로그인 해서 세션 가지고 있는지 여부
static boolean m_session = false ;
 
static long m_sessionLimitTime = 600000 ;  /// 세션 시간제한 (밀리세컨드)
static long m_sessionTime = 0 ;    /// 세션을 얻은 시간
 
 
 
 
/// 생성자
gsHttpRequester( )
{
 
}
 
/// 1. 세션이 유지되고있는지 체크
/// 2. 시간을 넘겼어도 세션 제거하고 false~
public boolean checkSession( )
{
if( !m_session )
{
return false ;
}
 
if( System.currentTimeMillis( ) < m_sessionTime + m_sessionLimitTime )
{
/// 제한시간 아직 안넘었음 세션 유지 연장시킴
m_sessionTime = System.currentTimeMillis( ) ;
return true ;
}
else
{
/// 제한시간을 넘겼음 세션을 제거함
m_session = false ;
return false ;
}
}
 
/// Request를 받되 세션 유지를 위해 쿠키를 저장한다.
public String requestAndSetSession( String uri, Map<String, Object> params ) throwsMalformedURLException, IOException
{
/// 일단 주소에 데이터랑 보내고
String rec = request( new URL( uri ), "POST", params ) ;
 
/// 맵에다 Http헤더를 받아냄
Map<String, List<String>> imap = m_con.getHeaderFields( ) ;
 
/// 그리고 거길 뒤져서 쿠키를 찾아냄
if( imap.containsKey( "Set-Cookie" ) )
{
/// 쿠키를 스트링으로 쫙 저장함
Collections c = (Collections)imap.get( "Set-Cookie" ) ;
m_cookies = c.toString( ) ;
 
/// 세션을 저장했으니
m_session = true ;
}
else
{
m_session = false ;
}
 
/// 돌려주는 값은 리퀘스트값 뿐이지만  m_session값을 셋팅하니까
/// checkSession( ) 함수를 호출해서 쿠키를 성공적으로 얻었는지 확인 가능함
return rec ;
 
}
 
 
/// 리퀘스트 받아오는 함수
/// ( URL주소, 방식(GET or POST), 변수명+변수값 ) ;
protected String request( URL url, String method, Map<String, Object> params) throws IOException
{
/// 받아올 인풋스트림
/// POST방식일 경우 데이터를 전송할 아웃풋 스트림
InputStream in = null ;
OutputStream out = null ;
 
/// 연결하고 메소드 셋팅함
m_con = (HttpURLConnection) url.openConnection( ) ;
///String wwwstring = URLEncoder.encode( url.toString() ) ;
m_con.setRequestMethod(method);
 
/// 인코딩 정의 HTTP방식으로 전송할때는 urlencoded방식으로 인코딩해서 전송해야한다.
m_con.setRequestProperty("Content-Type""application/x-www-form-urlencoded");
/// 인풋스트림 쓸거라고 지정
m_con.setDoInput(true);
 
if( m_session )
{
m_con.setRequestProperty( "cookie", m_cookies ) ;
}
 
/// 포스트방식일 경우 변수를 outputStream생성해서 서버로 전송
if (method.equals("POST"))
{
/// 데이터를 주소와 별개로 전송한다.
m_con.setDoOutput(true);       /// 아웃풋 스트림 쓰기위에 아웃풋을 true로 켬
 
String paramstr = buildParameters( params ) ; /// 파라메터를 문자열로 치환
 
out = m_con.getOutputStream( ) ;    /// 아웃풋 스트림 생성
out.write( paramstr.getBytes( "UTF-8" ) ) ;  /// UTF-8포멧으로 변경해서 변수를 쓴다.
out.flush( ) ;         /// 플러쉬~
out.close( ) ;         /// 스트림 닫기
Log.d( "jsonPrint""post succes" ) ;   /// 로그출력
}
 
 
/// 받아온 데이터를 씍위한 스트림
ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
/// 리퀘스트 데이터를 저장할 버퍼
byte[] buf = new byte[131072];
try
{
int k = 0 /// 읽은 라인수
long ti = System.currentTimeMillis( ) ;        /// == 시간 체크용 == 서버에 따라 리퀘스트 오는 시간이 매우 오래걸림
in = m_con.getInputStream();     /// 인풋스트림 생성
Log.d( "---recTime---""" + (System.currentTimeMillis( ) - ti) ) ; /// == 시간 체크용 == inputstream얻는 요기서 시간 10초이상 넘어가면 큰일남
/// 갤럭시 S에서 어떤앱은 WebView라던가 Http통신에서 15초인가 넘어가면 세션 끊기는
/// 원인을 알 수 없는 경우도 있었음 다른기기 다 잘되는데 오로지 갤럭시 S만!!! 그랬음 참고 바람요
/// 루프를 돌면서 리퀘스트로 받은내용을 저장한다.
while (true)
{
int readlen = in.read(buf);
if (readlen < 1)
break;
k += readlen ;
bos.write(buf, 0, readlen);
}
 
m_request = new String( bos.toByteArray( ), "UTF-8" ) ;
/////// 리퀘스트 받은 내용을 UTF-8로 변경해서 문자열로 저장 /////////////////
/*
File fl = new File( "/sdcard/rec.txt" ) ;
FileOutputStream fos = new FileOutputStream( fl ) ;
fos.write( bos.toByteArray( ) ) ;
 
/**/
return m_request ;
}
catch (IOException e)
{
/// 리퀘스트 받다가 에러가 나면 에러나면서 받은 메세지를 읽는다.
if (m_con.getResponseCode() == 500)
{
/// 버퍼 리셋하고 에러값 받을 인풋스트림 생성해서 레어메세지 얻기
bos.reset();
InputStream err = m_con.getErrorStream();
while (true)
{
int readlen = err.read( buf ) ;
if ( readlen < 1 )
break ;
bos.write( buf, 0, readlen ) ;
}
 
/// 에러메세지를 문자열로 저장
String output = new String(bos.toByteArray(), "UTF-8");
 
/// 읽은 에러메세지를 출력한다.
System.err.println(output);
}
throw e;
}
finally /// 500에러도 아니면 그냥 접속 끊어버림.... -_- 안되는데 답있나?
{
if ( in != null )
in.close( ) ;
if ( m_con != null )
m_con.disconnect( ) ;
}
}
 
/// 파라메터 받은 값을  "변수명=변수값&" 형식의 텍스트로 변환해주는 함수
protected String buildParameters(Map<String, Object> params) throws IOException
{
if( params != null )
{
return "" ;
}
 
StringBuilder sb = new StringBuilder( ) ;
 
/// 잘 아시겠지만 arg1=초코릿&arg2=아이스크림&arg3=핫초코  이런식으로 만들어서 날린다.
for( Iterator<String> i = params.keySet( ).iterator( )  ; i.hasNext( )  ;  )
{
String key = (String) i.next();
sb.append(key);
sb.append("=");
sb.append(URLEncoder.encode(String.valueOf(params.get(key)), "UTF-8"));
if (i.hasNext())
sb.append("&");
}
return sb.toString();
}
 
}




http://www.androidpub.com/1298998

Comments