android之http通讯,
来源:互联网 发布:儿童教育软件推荐 编辑:程序博客网 时间:2024/05/21 06:59
1. HttpURLConnection接口
首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:
- URL url = new URL("http://www.51cto.com/index.jsp?par=123456");
- HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
通过以下方法可以对请求的属性进行一些设置,如下所示:
- //设置输入和输出流
- urlConn.setDoOutput(true);
- urlConn.setDoInput(true);
- //设置请求方式为POST
- urlConn.setRequestMethod("POST");
- //POST请求不能使用缓存
- urlConn.setUseCaches(false);
- //关闭连接
- urlConn.disConnection();
HttpURLConnection默认使用GET方式,例如下面代码所示:
- //使用HttpURLConnection打开连接
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- //得到读取的内容(流)
- InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
- // 为输出创建BufferedReader
- BufferedReader buffer = new BufferedReader(in);
- String inputLine = null;
- //使用循环来读取获得的数据
- while (((inputLine = buffer.readLine()) != null))
- {
- //我们在每一行后面加上一个"\n"来换行
- resultData += inputLine + "\n";
- }
- //关闭InputStreamReader
- in.close();
- //关闭http连接
- urlConn.disconnect();
如果需要使用POST方式,则需要setRequestMethod设置。代码如下:
- String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
- //获得的数据
- String resultData = "";
- URL url = null;
- try
- {
- //构造一个URL对象
- url = new URL(httpUrl);
- }
- catch (MalformedURLException e)
- {
- Log.e(DEBUG_TAG, "MalformedURLException");
- }
- if (url != null)
- {
- try
- {
- // 使用HttpURLConnection打开连接
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- //因为这个是post请求,设立需要设置为true
- urlConn.setDoOutput(true);
- urlConn.setDoInput(true);
- // 设置以POST方式
- urlConn.setRequestMethod("POST");
- // Post 请求不能使用缓存
- urlConn.setUseCaches(false);
- urlConn.setInstanceFollowRedirects(true);
- // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
- urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
- // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
- // 要注意的是connection.getOutputStream会隐含的进行connect。
- urlConn.connect();
- //DataOutputStream流
- DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
- //要上传的参数
- String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");
- //将要上传的内容写入流中
- out.writeBytes(content);
- //刷新、关闭
- out.flush();
- out.close();
2. HttpClient接口
使用Apache提供的HttpClient接口同样可以进行HTTP操作。
对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:
- // http地址
- String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";
- //HttpGet连接对象
- HttpGet httpRequest = new HttpGet(httpUrl);
- //取得HttpClient对象
- HttpClient httpclient = new DefaultHttpClient();
- //请求HttpClient,取得HttpResponse
- HttpResponse httpResponse = httpclient.execute(httpRequest);
- //请求成功
- if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
- {
- //取得返回的字符串
- String strResult = EntityUtils.toString(httpResponse.getEntity());
- mTextView.setText(strResult);
- }
- else
- {
- mTextView.setText("请求错误!");
- }
- }
使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。,另外,还需要设置所使用的字符集。代码如下所示:
- // http地址
- String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
- //HttpPost连接对象
- HttpPost httpRequest = new HttpPost(httpUrl);
- //使用NameValuePair来保存要传递的Post参数
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- //添加要传递的参数
- params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));
- //设置字符集
- HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");
- //请求httpRequest
- httpRequest.setEntity(httpentity);
- //取得默认的HttpClient
- HttpClient httpclient = new DefaultHttpClient();
- //取得HttpResponse
- HttpResponse httpResponse = httpclient.execute(httpRequest);
- //HttpStatus.SC_OK表示连接成功
- if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
- {
- //取得返回的字符串
- String strResult = EntityUtils.toString(httpResponse.getEntity());
- mTextView.setText(strResult);
- }
- else
- {
- mTextView.setText("请求错误!");
- }
- }
HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。
另外,在使用POST方式进行传输时,需要进行字符编码。
这里有一个非常棒的http通讯的总结,我看了以后茅塞顿开。
先贴代码:
01
public
class
Activity1
extends
Activity {
02
03
private
final
String DEBUG_TAG =
"System.out"
;
04
05
private
TextView mTextView;
06
private
Button mButton;
07
08
protected
void
onCreate(Bundle savedInstanceState) {
09
super
.onCreate(savedInstanceState);
10
setContentView(R.layout.main);
11
12
mTextView = (TextView) findViewById(R.id.TextView01);
13
mButton = (Button) findViewById(R.id.Button01);
14
mButton.setOnClickListener(
new
httpListener());
15
}
16
17
// 设置按钮监听器
18
class
httpListener
implements
OnClickListener {
19
public
void
onClick(View v) {
20
refresh();
21
}
22
}
23
24
private
void
refresh() {
25
String httpUrl =
"http://192.168.0.101:8080/Test/test.jsp"
;
26
// URL可以加参数
27
// String httpUrl =
28
// "http://192.168.0.101:8080/Test/test.jsp?par=abcdefg";
29
String resultData =
""
;
30
URL url =
null
;
31
try
{
32
// 创建一个URL对象
33
url =
new
URL(httpUrl);
34
}
catch
(MalformedURLException e) {
35
Log.d(DEBUG_TAG,
"create URL Exception"
);
36
}
37
// 声明HttpURLConnection对象
38
HttpURLConnection urlConn =
null
;
39
// 声明InputStreamReader对象
40
InputStreamReader in =
null
;
41
// 声明BufferedReader对象
42
BufferedReader buffer =
null
;
43
String inputLine =
null
;
44
if
(url !=
null
) {
45
try
{
46
// 使用HttpURLConnection打开连接
47
urlConn = (HttpURLConnection) url.openConnection();
48
// 得到读取的内容(流)
49
in =
new
InputStreamReader(urlConn.getInputStream());
50
// 创建BufferReader对象,输出时候用到
51
buffer =
new
BufferedReader(in);
52
// 使用循环来读取数据
53
while
((inputLine = buffer.readLine()) !=
null
) {
54
// 在每一行后面加上换行
55
resultData += inputLine +
"\n"
;
56
}
57
// 设置显示取的的内容
58
if
(resultData !=
null
&& !resultData.equals(
""
)) {
59
mTextView.setText(resultData);
60
}
else
{
61
mTextView.setText(
"读取的内容为空"
);
62
}
63
}
catch
(IOException e) {
64
e.printStackTrace();
65
}
finally
{
66
try
{
67
// 关闭InputStreamReader
68
in.close();
69
// 关闭URL连接
70
urlConn.disconnect();
71
}
catch
(IOException e) {
72
e.printStackTrace();
73
}
74
}
75
}
else
{
76
Log.d(DEBUG_TAG,
"URL is NULL"
);
77
}
78
}
79
}
第二种方式:
001
public
class
Activity2
extends
Activity {
002
003
private
final
String DEBUG_TAG =
"System.out"
;
004
005
private
TextView mTextView;
006
private
Button mButton;
007
008
protected
void
onCreate(Bundle savedInstanceState) {
009
super
.onCreate(savedInstanceState);
010
setContentView(R.layout.main);
011
012
mTextView = (TextView) findViewById(R.id.TextView01);
013
mButton = (Button) findViewById(R.id.Button01);
014
mButton.setOnClickListener(
new
httpListener());
015
}
016
017
// 设置按钮监听器
018
class
httpListener
implements
OnClickListener {
019
public
void
onClick(View v) {
020
refresh();
021
}
022
}
023
024
private
void
refresh() {
025
String httpUrl =
"http://192.168.0.101:8080/Test/test.jsp"
;
026
String resultData =
""
;
027
URL url =
null
;
028
try
{
029
// 创建一个URL对象
030
url =
new
URL(httpUrl);
031
}
catch
(MalformedURLException e) {
032
Log.d(DEBUG_TAG,
"create URL Exception"
);
033
}
034
// 声明HttpURLConnection对象
035
HttpURLConnection urlConn =
null
;
036
// 声明InputStreamReader对象
037
InputStreamReader in =
null
;
038
// 声明BufferedReader对象
039
BufferedReader buffer =
null
;
040
String inputLine =
null
;
041
// 声明DataOutputStream流
042
DataOutputStream out =
null
;
043
if
(url !=
null
) {
044
try
{
045
// 使用HttpURLConnection打开连接
046
urlConn = (HttpURLConnection) url.openConnection();
047
// 因为这个是POST请求所以要设置为true
048
urlConn.setDoInput(
true
);
049
urlConn.setDoOutput(
true
);
050
// 设置POST方式
051
urlConn.setRequestMethod(
"POST"
);
052
// POST请求不能设置缓存
053
urlConn.setUseCaches(
false
);
054
urlConn.setInstanceFollowRedirects(
false
);
055
// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
056
urlConn.setRequestProperty(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
057
// 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成
058
// 要注意的是connectio.getOutputStream会隐含的进行connect
059
urlConn.connect();
060
// DataOutputStream流
061
out =
new
DataOutputStream(urlConn.getOutputStream());
062
String content =
"par="
+ URLEncoder.encode(
"abcdefg"
,
"gb2312"
);
063
// 将要上传的内容写入流中
064
out.writeBytes(content);
065
// 得到读取的内容(流)
066
in =
new
InputStreamReader(urlConn.getInputStream());
067
// 创建BufferReader对象,输出时候用到
068
buffer =
new
BufferedReader(in);
069
// 使用循环来读取数据
070
while
((inputLine = buffer.readLine()) !=
null
) {
071
// 在每一行后面加上换行
072
resultData += inputLine +
"\n"
;
073
}
074
// 设置显示取的的内容
075
if
(resultData !=
null
&& !resultData.equals(
""
)) {
076
mTextView.setText(resultData);
077
}
else
{
078
mTextView.setText(
"读取的内容为空"
);
079
}
080
}
catch
(IOException e) {
081
e.printStackTrace();
082
}
finally
{
083
try
{
084
// 刷新DataOutputStream流
085
out.flush();
086
// 关闭DataOutputStream流
087
out.close();
088
// 关闭InputStreamReader
089
in.close();
090
// 关闭URL连接
091
urlConn.disconnect();
092
}
catch
(IOException e) {
093
e.printStackTrace();
094
}
095
}
096
}
else
{
097
Log.d(DEBUG_TAG,
"URL is NULL"
);
098
}
099
}
100
}
第三种方式
01
public
class
Activity3
extends
Activity{
02
private
TextView mTextView;
03
private
Button mButton;
04
05
protected
void
onCreate(Bundle savedInstanceState) {
06
super
.onCreate(savedInstanceState);
07
setContentView(R.layout.main);
08
mTextView = (TextView) findViewById(R.id.TextView01);
09
mButton = (Button) findViewById(R.id.Button01);
10
mButton.setOnClickListener(
new
httpListener());
11
}
12
13
// 设置按钮监听器
14
class
httpListener
implements
OnClickListener {
15
public
void
onClick(View v) {
16
String httpUrl =
"http://192.168.0.101:8080/Test/test.jsp?par=HttpClient_android_Get"
;
17
// HttpGet连接对象
18
HttpGet httpRequest =
new
HttpGet(httpUrl);
19
try
{
20
// 取的HttpClient对象
21
HttpClient httpclient =
new
DefaultHttpClient();
22
// 请求HttpClient,取的HttpResponse
23
HttpResponse httpResponse = httpclient.execute(httpRequest);
24
// 请求成功
25
if
(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
26
// 取的返回的字符串
27
String strResult = EntityUtils.toString(httpResponse.getEntity());
28
// 这个返回值可能会在行尾出现小方格
29
// 在TextView要显示的文字过滤掉回车符("\r")就可以正常显示了。
30
String strsResult = strResult.replace(
"\r"
,
""
);
31
mTextView.setText(strsResult);
32
}
else
{
33
mTextView.setText(
"请求错误"
);
34
}
35
}
catch
(ClientProtocolException e) {
36
mTextView.setText(e.getMessage().toString());
37
}
catch
(IOException e) {
38
mTextView.setText(e.getMessage().toString());
39
}
catch
(Exception e) {
40
mTextView.setText(e.getMessage().toString());
41
}
42
}
43
}
44
}
第四种方式
01
public
class
Activity4
extends
Activity{
02
private
TextView mTextView;
03
private
Button mButton;
04
05
protected
void
onCreate(Bundle savedInstanceState) {
06
super
.onCreate(savedInstanceState);
07
setContentView(R.layout.main);
08
mTextView = (TextView) findViewById(R.id.TextView01);
09
mButton = (Button) findViewById(R.id.Button01);
10
mButton.setOnClickListener(
new
httpListener());
11
}
12
13
// 设置按钮监听器
14
class
httpListener
implements
OnClickListener {
15
public
void
onClick(View arg0) {
16
String httpUrl =
"http://192.168.0.101:8080/Test/test.jsp"
;
17
// 创建HttpPost连接对象
18
HttpPost httpRequest =
new
HttpPost(httpUrl);
19
// 使用NameValuePair来保存要传递的Post参数
20
List params =
new
ArrayList();
21
// 添加要传递的参数
22
params.add(
new
BasicNameValuePair(
"par"
,
"HttpClient_android_Post"
));
23
try
{
24
// 设置字符集
25
HttpEntity httpentity =
new
UrlEncodedFormEntity(params,
"gb2312"
);
26
// 请求httpRequest
27
httpRequest.setEntity(httpentity);
28
// 取的默认的HttpClient
29
HttpClient httpclient =
new
DefaultHttpClient();
30
// 取的HttpResponse
31
HttpResponse httpResponse = httpclient.execute(httpRequest);
32
// HttpStatus.SC_OK表示连接成功
33
if
(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
34
// 取的返回的字符串
35
String strResult = EntityUtils.toString(httpResponse.getEntity());
36
// 这个返回值可能会在行尾出现小方格
37
// 在TextView要显示的文字过滤掉回车符("\r")就可以正常显示了。
38
String strsResult = strResult.replace(
"\r"
,
""
);
39
mTextView.setText(strsResult);
40
}
else
{
41
mTextView.setText(
"请求错误"
);
42
}
43
}
catch
(ClientProtocolException e) {
44
mTextView.setText(e.getMessage().toString());
45
}
catch
(IOException e) {
46
mTextView.setText(e.getMessage().toString());
47
}
catch
(Exception e) {
48
mTextView.setText(e.getMessage().toString());
49
}
50
}
51
}
52
}
- android之http通讯,
- Android-HTTP通讯总结!
- android http 通讯相关
- Android开发——HTTP通讯
- Android上HTTP协议通讯状态获取
- Android-非常棒的HTTP通讯总结
- Android-非常棒的HTTP通讯总结
- Android中Http通讯的一般过程
- Android-非常棒的HTTP通讯总结
- Android-非常棒的HTTP通讯总结
- Android-非常棒的HTTP通讯总结
- Android-非常棒的HTTP通讯总结
- android中的http通讯(2)
- HTTP通讯
- Http通讯
- android 功能模块之通讯模块
- Android之Socket,Service通讯
- Android之UDP协议通讯
- Linux内核开发之中断与时钟(一)
- 公司首席设计师推荐的视觉体验设计站点很不错
- 通过java代码使用zookeeper
- 指针和引用的区别
- kali linux gnome3.4桌面合上笔记本盖子依然保持唤醒设置方法
- android之http通讯,
- EXISTS 和 IN
- 多线程访问共享数据的Bug
- Linux内核开发之中断与时钟(二)
- mysql 定时备份数据
- android 日历图标显示星期
- Linux内核开发之中断与时钟(三)
- Linux内核开发之中断与时钟(四)
- db万能数据库查询分析器