1.概念
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
除此之外,在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持 HTTP 协议工具包,并且它支持 HTTP 协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。
2.区别
HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,
HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。
URLConnection |
HTTPClient |
|
---|---|---|
Proxies and SOCKS |
Full support in Netscape browser, appletviewer, and applications (SOCKS: Version 4 only); no additional limitations from security policies. |
Full support (SOCKS: Version 4 and 5); limited in applets however by security policies; in Netscape can't pick up the settings from the browser. |
Authorization |
Full support for Basic Authorization in Netscape (can use info given by the user for normal accesses outside of the applet); no support in appletviewer or applications. |
Full support everywhere; however cannot access previously given info from Netscape, thereby possibly requesting the user to enter info (s)he has already given for a previous access. Also, you can add/implement additional authentication mechanisms yourself. |
Methods |
Only has GET and POST. |
Has HEAD, GET, POST, PUT, DELETE, TRACE and OPTIONS, plus any arbitrary method. |
Headers |
Currently you can only set any request headers if you are doing a POST under Netscape; for GETs and the JDK you can't set any headers. |
Allows any arbitrary headers to be sent and received. |
Automatic Redirection Handling |
Yes. |
Yes (as allowed by the HTTP/1.1 spec). |
Persistent Connections |
No support currently in JDK; under Netscape uses HTTP/1.0 Keep-Alive's. |
Supports HTTP/1.0 Keep-Alive's and HTTP/1.1 persistence. |
Pipelining of Requests |
No. |
Yes. |
Can handle protocols other than HTTP |
Theoretically; however only http is currently implemented. |
No. |
Can do HTTP over SSL (https) |
Under Netscape, yes. Using Appletviewer or in an application, no. |
No (not yet). |
Source code available |
No. |
Yes. |
3.案例
URLConnection
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
64
65
66
67
68
69
70
71
72
|
String urlAddress =
"http://192.168.1.102:8080/AndroidServer/login.do"
;
URL url;
HttpURLConnection uRLConnection;
public
UrlConnectionToServer(){
}
//向服务器发送get请求
public
String doGet(String username,String password){
String getUrl = urlAddress +
"?username="
+username+
"&password="
+password;
try
{
url =
new
URL(getUrl);
uRLConnection = (HttpURLConnection)url.openConnection();
InputStream is = uRLConnection.getInputStream();
BufferedReader br =
new
BufferedReader(
new
InputStreamReader(is));
String response =
""
;
String readLine =
null
;
while
((readLine =br.readLine()) !=
null
){
//response = br.readLine();
response = response + readLine;
}
is.close();
br.close();
uRLConnection.disconnect();
return
response;
}
catch
(MalformedURLException e) {
e.printStackTrace();
return
null
;
}
catch
(IOException e) {
e.printStackTrace();
return
null
;
}
}
//向服务器发送post请求
public
String doPost(String username,String password){
try
{
url =
new
URL(urlAddress);
uRLConnection = (HttpURLConnection)url.openConnection();
uRLConnection.setDoInput(
true
);
uRLConnection.setDoOutput(
true
);
uRLConnection.setRequestMethod(
"POST"
);
uRLConnection.setUseCaches(
false
);
uRLConnection.setInstanceFollowRedirects(
false
);
uRLConnection.setRequestProperty(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
uRLConnection.connect();
DataOutputStream out =
new
DataOutputStream(uRLConnection.getOutputStream());
String content =
"username="
+username+
"&password="
+password;
out.writeBytes(content);
out.flush();
out.close();
InputStream is = uRLConnection.getInputStream();
BufferedReader br =
new
BufferedReader(
new
InputStreamReader(is));
String response =
""
;
String readLine =
null
;
while
((readLine =br.readLine()) !=
null
){
//response = br.readLine();
response = response + readLine;
}
is.close();
br.close();
uRLConnection.disconnect();
return
response;
}
catch
(MalformedURLException e) {
e.printStackTrace();
return
null
;
}
catch
(IOException e) {
e.printStackTrace();
return
null
;
}
}
|
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
String urlAddress =
"http://192.168.1.102:8080/qualityserver/login.do"
;
public
HttpClientServer(){
}
public
String doGet(String username,String password){
String getUrl = urlAddress +
"?username="
+username+
"&password="
+password;
HttpGet httpGet =
new
HttpGet(getUrl);
HttpParams hp = httpGet.getParams();
hp.getParameter(
"true"
);
//hp.
//httpGet.setp
HttpClient hc =
new
DefaultHttpClient();
try
{
HttpResponse ht = hc.execute(httpGet);
if
(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity he = ht.getEntity();
InputStream is = he.getContent();
BufferedReader br =
new
BufferedReader(
new
InputStreamReader(is));
String response =
""
;
String readLine =
null
;
while
((readLine =br.readLine()) !=
null
){
//response = br.readLine();
response = response + readLine;
}
is.close();
br.close();
//String str = EntityUtils.toString(he);
System.out.println(
"========="
+response);
return
response;
}
else
{
return
"error"
;
}
}
catch
(ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return
"exception"
;
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return
"exception"
;
}
}
public
String doPost(String username,String password){
//String getUrl = urlAddress + "?username="+username+"&password="+password;
HttpPost httpPost =
new
HttpPost(urlAddress);
List params =
new
ArrayList();
NameValuePair pair1 =
new
BasicNameValuePair(
"username"
, username);
NameValuePair pair2 =
new
BasicNameValuePair(
"password"
, password);
params.add(pair1);
params.add(pair2);
HttpEntity he;
try
{
he =
new
UrlEncodedFormEntity(params,
"gbk"
);
httpPost.setEntity(he);
}
catch
(UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
HttpClient hc =
new
DefaultHttpClient();
try
{
HttpResponse ht = hc.execute(httpPost);
//连接成功
if
(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity het = ht.getEntity();
InputStream is = het.getContent();
BufferedReader br =
new
BufferedReader(
new
InputStreamReader(is));
String response =
""
;
String readLine =
null
;
while
((readLine =br.readLine()) !=
null
){
//response = br.readLine();
response = response + readLine;
}
is.close();
br.close();
//String str = EntityUtils.toString(he);
System.out.println(
"=========&&"
+response);
return
response;
}
else
{
return
"error"
;
}
}
catch
(ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return
"exception"
;
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return
"exception"
;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
resp.setContentType(
"text/json"
);
resp.setCharacterEncoding(
"UTF-8"
);
toDo =
new
ToDo();
List<userbean> list =
new
ArrayList<userbean>();
list = toDo.queryUsers(mySession);
String body;
//设定JSON
JSONArray array =
new
JSONArray();
for
(UserBean bean : list)
{
JSONObject obj =
new
JSONObject();
try
{
obj.put(
"username"
, bean.getUserName());
obj.put(
"password"
, bean.getPassWord());
}
catch
(Exception e){}
array.add(obj);
}
pw.write(array.toString());
System.out.println(array.toString()); </userbean></userbean>
|
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
64
65
66
67
68
69
70
71
|
String urlAddress =
"http://192.168.1.102:8080/qualityserver/result.do"
;
String body =
getContent(urlAddress);
JSONArray array =
new
JSONArray(body);
for
(
int
i=
0
;i map =
new
HashMap<string, object=
""
>();
try
{
userName = obj.getString(
"username"
);
passWord = obj.getString(
"password"
);
}
catch
(JSONException e) {
e.printStackTrace();
}
map.put(
"username"
, userName);
map.put(
"password"
, passWord);
listItem.add(map);
}
}
catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if
(sb!=
null
)
{
showResult.setText(
"用户名和密码信息:"
);
showResult.setTextSize(
20
);
}
else
extracted();
//设置adapter
SimpleAdapter simple =
new
SimpleAdapter(
this
,listItem,
android.R.layout.simple_list_item_2,
new
String[]{
"username"
,
"password"
},
new
int
[]{android.R.id.text1,android.R.id.text2});
listResult.setAdapter(simple);
listResult.setOnItemClickListener(
new
OnItemClickListener() {
@Override
public
void
onItemClick(AdapterView<!--?--> parent, View view,
int
position,
long
id) {
int
positionId = (
int
) (id+
1
);
Toast.makeText(MainActivity.
this
,
"ID:"
+positionId, Toast.LENGTH_LONG).show();
}
});
}
private
void
extracted() {
showResult.setText(
"没有有效的数据!"
);
}
//和服务器连接
private
String getContent(String url)
throws
Exception{
StringBuilder sb =
new
StringBuilder();
HttpClient client =
new
DefaultHttpClient();
HttpParams httpParams =client.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams,
3000
);
HttpConnectionParams.setSoTimeout(httpParams,
5000
);
HttpResponse response = client.execute(
new
HttpGet(url));
HttpEntity entity =response.getEntity();
if
(entity !=
null
){
BufferedReader reader =
new
BufferedReader(
new
InputStreamReader
(entity.getContent(),
"UTF-8"
),
8192
);
String line =
null
;
while
((line= reader.readLine())!=
null
){
sb.append(line +
"\n"
);
}
reader.close();
}
return
sb.toString();
} </string,></array.length();i++)>
|