Android 네트워크 요청 조작 httpurlconnection 및 httpclient 기본 사용
8850 단어 Android 네트워크 작업 요청
1) Get은 서버에 데이터를 요청하는 요청이고, Post는 서버에 데이터를 제출하는 요청입니다.
2) Get은 정보를 얻는 것이지 정보를 수정하는 것이 아니다. 데이터베이스 조회 기능과 같이 데이터는 수정되지 않는다
3) get 방식에 대해 서버 측에서 Request를 사용합니다.QueryString은 변수의 값을 가져옵니다.post 방식에 대해 서버 측은 Request를 사용합니다.Form 커밋된 데이터 가져오기
4) get이 전송하는 데이터의 양이 2KB보다 작으면 안 됩니다.post가 전송하는 데이터의 양이 비교적 크며, 일반적으로 기본적으로 제한을 받지 않습니다.그러나 이론적으로 IIS4에서 최대 80KB, IIS5에서 100KB
5) Get 요청의 매개 변수는 URL 뒤에 전달되고 요청된 데이터는 URL 뒤에 첨부됩니다.URL과 전송 데이터를 분할하고 매개 변수 사이를 & 연결합니다.%XX의 XX는 이 기호로 16진수로 표시된 ASCII입니다. 데이터가 영문자/숫자이면 그대로 보내고 빈칸이면 +로 변환하고 중국어/다른 문자열이면 문자열을 BASE64로 직접 암호화합니다. get 보안이 매우 낮고post 보안이 높습니다.
2. http 상태 코드 반환 요청
상태 코드
함의
100~199
클라이언트가 다음 요청을 계속 제출해야 전체 처리 과정을 완성할 수 있음을 나타냅니다.
200~299
요청을 성공적으로 수신하고 전체 프로세스를 완료했음을 나타냅니다.
300~399
요청을 완성하기 위해서는 고객이 요청을 더욱 세분화해야 한다.예를 들어 요청한 자원이 새 주소로 이동했습니다.
400~499
클라이언트의 요청에 오류가 발생했습니다.
500~599
서버 측 오류
일반 상태 코드:
200(정상): 모든 것이 정상임을 표시하고 정상적인 요청 결과를 반환합니다.
302/307(임시 리디렉션): 요청된 문서가 다른 곳으로 임시 이동되었음을 나타냅니다. 이 문서의 새 URL은 Location 응답 헤더에 표시됩니다.
304(수정되지 않음): 클라이언트 캐시의 버전이 최신 버전임을 나타냅니다. 클라이언트는 서비스자에게 요청할 필요가 없이 계속 사용할 수 있습니다.
404(찾을 수 없음): 서버에 클라이언트가 요청한 자원이 없습니다.
500(서버 내부 오류): 서버 측의 프로그램 오류
3. httpurlconnection 기본 사용법
1) 기본 Get 요청
try {
String url = "http://apis.juhe.cn/mobile/get" + "?phone=" + URLEncoder.encode("13429667914", "utf-8")
+ "&key=" + "3a0152ec37d15dee57b380669fe714a2";
URL url1 = new URL(url);
HttpURLConnection urlConn = (HttpURLConnection) url1.openConnection();
urlConn.setRequestProperty("content-type", "application/json");
urlConn.setDoInput(true);
urlConn.setDoOutput(true);
urlConn.setConnectTimeout(5 * 1000);
// PUT
urlConn.setRequestMethod("GET");
urlConn.setRequestProperty("Charset", "UTF-8");
Log.i("888", "" + urlConn.getResponseCode());
if (urlConn.getResponseCode() == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String str;
StringBuffer sb = new StringBuffer();
while ((str = reader.readLine()) != null) {
sb.append(str);
}
Log.i("esasdasd", "result:" + sb.toString());
Message message = new Message();
message.what = 111;
message.obj = sb.toString();
handler.sendMessage(message);
urlConn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
2) 기본 포스트 요청
URL url1 = null;
try {
url1 = new URL(http://192.168.2.69:8888/user/sign-in?ds=mobile);
} catch (MalformedURLException e) {
e.printStackTrace();
}
if (url1 != null) {
try {
HttpURLConnection urlConn = (HttpURLConnection) url1.openConnection();
urlConn.setRequestProperty("content-type", "application/json");
urlConn.setDoInput(true);
urlConn.setDoOutput(true);
urlConn.setConnectTimeout(5 * 1000);
// PUT
urlConn.setRequestMethod("POST");
urlConn.setRequestProperty("Content-Type", "application/json");
urlConn.setRequestProperty("Accept", "application/json");
urlConn.setRequestProperty("Charset", "UTF-8");
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
//
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", "username");
jsonObject.put("email", "email");
jsonObject.put("password", "password");
dos.writeBytes(jsonObject.toString());
dos.flush();
dos.close();
Log.i("888", ""+urlConn.getResponseCode());
if (urlConn.getResponseCode() == 200) {
//
InputStream in = urlConn.getInputStream();
String a = null;
try {
byte[] data1 = new byte[in.available()];
in.read(data1);
//
a = new String(data1);
System.out.println(a);
final StringBuffer sb = new StringBuffer(a);
handler.post(new Runnable() {
@Override
public void run() {
List list=parseJson(sb.toString());
Message message=new Message();
message.obj=list;
handler.sendMessage(message);
}
});
} catch (Exception e1) {
e1.printStackTrace();
}
urlConn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
4. HttpclientGet 요청 기본 사용
1) client = new DefaultHttpClient();
// , Cookie
((AbstractHttpClient) client).setCookieStore(FirstActivity.cookieStore);
HttpGet post = new HttpGet(url);
post.addHeader("contentType", "application/json");
try {
postResp = client.execute(post);
int return_code = postResp.getStatusLine().getStatusCode();
if (return_code == 200) {
final String recives = EntityUtils.toString(postResp.getEntity());
Log.d("recives", recives);
handler.post(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = 222;
message.obj = recives.toString();
handler.sendMessage(message);
}
});
} else if (return_code == 400) {
Log.d("recives", "error" + return_code);
} else {
Log.d("recives", "error" + return_code);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2) Post 기본 사용
client = new DefaultHttpClient();
// , Cookie
((AbstractHttpClient) client).setCookieStore(FirstActivity.cookieStore);
HttpPost post = new HttpPost(url);
post.addHeader("contentType", "application/json");
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", "username");
jsonObject.put("email", "username");
jsonObject.put("password", "password");
post.setEntity(new StringEntity(jsonObject.toString(), "utf-8"));
postResp = client.execute(post);
int return_code = postResp.getStatusLine().getStatusCode();
if (return_code == 200) {
final String recives = EntityUtils.toString(postResp.getEntity());
Log.d("recives", recives);
handler.post(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what=222;
message.obj = recives.toString();
handler.sendMessage(message);
}
});
} else if (return_code == 400) {
Log.d("recives", "error"+return_code);
} else {
Log.d("recives", "error"+return_code);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
5. 코드가 부족한 부분
URL url1 = null;
private HttpClient client;
HttpResponse postResp;
private final static BasicCookieStore cookieStore = new BasicCookieStore();
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 111:
String string=(String) msg.obj;
Toast.makeText(FirstActivity.this, string, Toast.LENGTH_SHORT).show();
break;
case 222:
String string1=(String) msg.obj;
Toast.makeText(FirstActivity.this, string1, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
super.handleMessage(msg);
}
};
6. 보충할 부분
1.//유지 및 서버 로그인 상태가 계속 로그인되어 있으므로 전역 고유의 Cookie(AbstractHttpClient)client를 적게 설정할 수 없습니다.setCookieStore(LoginHttpThread.cookieStore); 2. 후속 보충