단일 모드 로 자신의 HttpClient 도구 클래스 구현
21323 단어 httpclient
안 드 로 이 드 개발 에서 저 희 는 네트워크 연결 기능 을 사용 하여 서버 와 데이터 의 상호작용 을 자주 합 니 다.이 를 위해 안 드 로 이 드 의 SDK 는 Apache 의 HttpClient 를 제공 하여 다양한 Http 서 비 스 를 사용 할 수 있 도록 합 니 다.HttpClient 를 브 라 우 저 로 상상 할 수 있 습 니 다.API 를 통 해 GET,POST 요청 을 편리 하 게 보 낼 수 있 습 니 다.
예 를 들 어 다음 몇 줄 의 코드 만 있 으 면 간단 한 GET 요청 을 하고 응답 결 과 를 인쇄 할 수 있 습 니 다.
try {
// HttpClient
HttpClient httpclient =new DefaultHttpClient();
// GET
HttpGet request =new HttpGet("www.google.com");
// GET ,
String response = httpclient.execute(request, new BasicResponseHandler());
Log.v("response text", response);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
왜 단일 HttpClient 를 사용 합 니까?
이것 은 프 리 젠 테 이 션 코드 일 뿐 실제 프로젝트 의 요청 과 응답 처리 가 복잡 할 뿐만 아니 라 코드 의 잘못 사용 도 고려 해 야 하지만 이것 은 본 편의 중점 이 아니다.주의 코드 의 세 번 째 줄:
HttpClient httpclient =new DefaultHttpClient();
HTTP 요청 을 보 내기 전에 HttpClient 대상 을 만 들 었 습 니 다.그러면 실제 프로젝트 에서 우 리 는 여러 곳 에서 HTTP 통신 을 해 야 할 가능성 이 높 습 니 다.이 럴 때 우 리 는 모든 요청 에 새로운 HttpClient 를 만 들 필요 가 없습니다.이전에 언급 했 듯 이 HttpClient 는 작은 브 라 우 저 와 같 기 때문에 전체 응용 프로그램 에 대해 우 리 는 HttpClient 하나만 있 으 면 충분 합 니 다.이곳 을 보면 틀림없이 누군가가 마음속 으로 생각 할 것 이다.이것 이 무슨 어 려 운 것 이 있 느 냐,단 례 로!!이렇게:
publicclass CustomerHttpClient {
privatestatic HttpClient customerHttpClient;
private CustomerHttpClient() {
}
publicstatic HttpClient getHttpClient() {
if(null== customerHttpClient) {
customerHttpClient =new DefaultHttpClient();
}
return customerHttpClient;
}
}
그럼 뭐 가 잘 못 됐 나 요?아니면 아직 완벽 하지 못 하 다 는 거 죠?
다 중 스 레 드!현재 우리 프로그램 은 같은 HttpClient 를 사용 하여 모든 Http 요청 을 관리 하고 있 습 니 다.동시 요청 이 발생 하면 다 중 스 레 드 문제 가 발생 할 수 있 습 니 다.이것 은 마치 우리 의 브 라 우 저 에 탭 이 하나 밖 에 없 는데 여러 명의 사용자 가 있 는 것 과 같다.A 는 구 글 에 가 려 고 하고 B 는 baidu 에 가 려 고 하 는데 이때 브 라 우 저 는 바 빠 서 바 쁠 수 없다.다행히도 HttpClient 는 스 레 드 보안 대상 을 만 드 는 API 를 제공 하여 스 레 드 보안 의'브 라 우 저'를 빠르게 얻 을 수 있 도록 도 와 줍 니 다.
다 중 스 레 드 문제 해결
publicclass CustomerHttpClient {
privatestaticfinal String CHARSET = HTTP.UTF_8;
privatestatic HttpClient customerHttpClient;
private CustomerHttpClient() {
}
publicstaticsynchronized HttpClient getHttpClient() {
if (null== customerHttpClient) {
HttpParams params =new BasicHttpParams();
//
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams
.setUserAgent(
params,
"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
+"AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
//
/* */
ConnManagerParams.setTimeout(params, 1000);
/* */
HttpConnectionParams.setConnectionTimeout(params, 2000);
/* */
HttpConnectionParams.setSoTimeout(params, 4000);
// HttpClient HTTP HTTPS
SchemeRegistry schReg =new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory
.getSocketFactory(), 443));
// HttpClient
ClientConnectionManager conMgr =new ThreadSafeClientConnManager(
params, schReg);
customerHttpClient =new DefaultHttpClient(conMgr, params);
}
return customerHttpClient;
}
}
위의 getHttpClient()방법 에서 저 희 는 HttpClient 에 기본 적 인 매개 변수 와 시간 초과 설정 을 설정 한 다음 ThreadSafeClient ConnManager 를 사용 하여 스 레 드 가 안전 한 HttpClient 를 만 듭 니 다.위의 코드 는 3 가지 시간 초과 설정 을 언급 하여 헷 갈 리 기 쉬 우 므 로 여기 서 특별히 분석 하 였 다.
HttpClient 의 3 가지 시간 초과 설명
/* */
ConnManagerParams.setTimeout(params, 1000);
/* */
HttpConnectionParams.setConnectionTimeout(params, 2000);
/* */
HttpConnectionParams.setSoTimeout(params, 4000);
첫 번 째 줄 설정 ConnectionPoolTimeout:ConnectionManager 가 관리 하 는 연결 풀 에서 연결 을 꺼 내 는 시간 초과 시간 을 정의 합 니 다.여 기 는 1 초 로 설정 합 니 다.
두 번 째 줄 설정 ConnectionTimeout:네트워크 를 통 해 서버 와 연결 하 는 시간 초과 시간 을 정의 합 니 다.Httpclient 패키지 에 서 는 서버 와 의 socket 연결 을 비동기 스 레 드 로 만 듭 니 다.이것 이 바로 이 socket 연결 의 시간 초과 입 니 다.2 초 로 설정 되 어 있 습 니 다.
세 번 째 줄 은 SocketTimeout 을 설정 합 니 다.이것 은 Socket 에서 데 이 터 를 읽 는 시간 초과 시간 을 정의 합 니 다.즉,서버 에서 응답 데 이 터 를 가 져 오 려 면 기 다 려 야 할 시간 을 4 초 로 설정 합 니 다.
상기 3 가지 초과 시간 은 각각 Connection PoolTimeoutException,Connection TimeoutException 과 SocketTimeoutException 을 던진다.
패키지 간단 한 POST 요청
하나의 HttpClient 대상 이 있 으 면 우 리 는 자주 사용 하 는 GET 와 POST 요청 을 보 내 는 코드 도 패키지 하여 우리 의 도구 류 에 쓸 수 있 습 니 다.현재 저 는 POST 요청 을 보 내 고 응답 문자열 을 되 돌려 주 는 방법 만 을 실현 하고 있 습 니 다.다음 코드 를 우리 의 customerHttpClient 클래스 에 추가 합 니 다:
privatestaticfinal String TAG ="CustomerHttpClient";
publicstatic String post(String url, NameValuePair... params) {
try {
//
List<NameValuePair> formparams =new ArrayList<NameValuePair>(); //
for (NameValuePair p : params) {
formparams.add(p);
}
UrlEncodedFormEntity entity =new UrlEncodedFormEntity(formparams,
CHARSET);
// POST
HttpPost request =new HttpPost(url);
request.setEntity(entity);
//
HttpClient client = getHttpClient();
HttpResponse response = client.execute(request);
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
thrownew RuntimeException(" ");
}
HttpEntity resEntity = response.getEntity();
return (resEntity ==null) ?null : EntityUtils.toString(resEntity, CHARSET);
} catch (UnsupportedEncodingException e) {
Log.w(TAG, e.getMessage());
returnnull;
} catch (ClientProtocolException e) {
Log.w(TAG, e.getMessage());
returnnull;
} catch (IOException e) {
thrownew RuntimeException(" ", e);
}
}
우리 customerHttpClient 도구 클래스 사용 하기
이제 전체 프로젝트 에서 우 리 는 이 도구 류 를 사용 하여 네트워크 통신 을 하 는 업무 코드 를 편리 하 게 작성 할 수 있 습 니 다.다음 코드 는 username 과 password 를 사용 하여 계 정 을 등록 하고 새 계 정 ID 를 얻 는 방법 을 보 여 줍 니 다.
final String url ="http://yourdomain/context/adduser";
//
NameValuePair param1 =new BasicNameValuePair("username", " ");
NameValuePair param2 =new BasicNameValuePair("password", "123456");
int resultId =-1;
try {
// POST , json , "{userid:12}"
String response = CustomerHttpClient.post(url, param1, param2);
JSONObject root =new JSONObject(response);
resultId = Integer.parseInt(root.getString("userid"));
Log.i(TAG, " ID:"+ resultId);
} catch (RuntimeException e) {
//
Log.w(TAG, e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
} catch (Exception e) {
// JSon
Log.w(TAG, e.getMessage());
}
결어
도구 류 를 사용 하면 프로젝트 에서 네트워크 통신 코드 를 작성 하 는 효율 을 크게 높 일 수 있 음 을 알 수 있다.그러나 이 도구 류 는 아직 보완 되 어야 합 니 다.여러분 의 오 류 를 보충 하고 교정 하 는 것 을 환영 합 니 다.마지막 으로 HttpClient 를 사용 하 는 가장 좋 은 실천 으로 도구 류 를 완성 하 기 를 바 랍 니 다.(완전무결 하 다
전 재 를 환영 하지만,전 재 는 출처 를 밝 혀 주 십시오http://www.cnblogs.com/codingmyworld/archive/2011/08/17/2141706.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HttpClient 'GET' - 각도 단순화이봐, 친구들. 오늘 저는 API를 호출하는 Angular의 방법을 분석하고 싶습니다. 각 CRUD 작업에 대한 기사를 작성할 예정이므로 눈을 떼지 말고 팔로우하십시오! 이것이 기본이며 Angular 웹 사이트에서 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.