SIMONE
BlogJava
首页
新随笔
新文章
联系
聚合
管理
posts - 495,comments - 227,trackbacks - 0
<
2013年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
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
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(46)
给我留言
查看公开留言
查看私人留言
随笔分类
(476)
.NET(14)
ActiveX控件(3)
AJAX(14)
android(4)
AXIS(31)
C++(26)
DELL笔记本重装系统(1)
flash(14)
hadoop(5)
hadoop mahout(3)
hbase(7)
JAVA(153)
JavaScript(55)
JSP(44)
LINUX(17)
mysql(6)
nodejs(3)
oracle(16)
PHP(2)
rmi(2)
Ruby on rails(1)
solr(5)
spark(2)
SQL SERVER(11)
struts(13)
tomcat(8)
vista(3)
收藏(13)
随笔档案
(495)
2016年11月 (1)
2016年10月 (3)
2016年8月 (2)
2016年7月 (7)
2016年6月 (5)
2016年5月 (7)
2016年3月 (3)
2016年2月 (1)
2016年1月 (1)
2015年11月 (2)
2015年9月 (3)
2015年8月 (4)
2015年7月 (1)
2015年6月 (2)
2015年5月 (2)
2015年4月 (6)
2015年3月 (2)
2014年12月 (5)
2014年11月 (2)
2014年10月 (1)
2014年9月 (3)
2014年7月 (1)
2014年6月 (1)
2014年5月 (1)
2014年3月 (1)
2013年11月 (3)
2013年9月 (1)
2013年3月 (3)
2013年2月 (6)
2013年1月 (1)
2012年12月 (1)
2012年11月 (8)
2012年10月 (2)
2012年9月 (9)
2012年8月 (5)
2012年7月 (10)
2012年6月 (2)
2012年5月 (1)
2012年4月 (2)
2012年3月 (5)
2012年2月 (4)
2012年1月 (3)
2011年11月 (4)
2011年10月 (16)
2011年9月 (8)
2011年8月 (1)
2011年7月 (6)
2011年6月 (5)
2011年5月 (3)
2011年4月 (12)
2011年3月 (2)
2011年2月 (3)
2010年12月 (4)
2010年11月 (4)
2010年10月 (1)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (2)
2010年4月 (12)
2010年2月 (2)
2010年1月 (3)
2009年11月 (1)
2009年9月 (2)
2009年8月 (3)
2009年7月 (2)
2009年6月 (8)
2009年5月 (1)
2009年3月 (3)
2009年2月 (4)
2009年1月 (3)
2008年11月 (6)
2008年8月 (2)
2008年7月 (9)
2008年5月 (5)
2008年4月 (4)
2008年3月 (3)
2008年2月 (2)
2008年1月 (5)
2007年12月 (1)
2007年11月 (3)
2007年10月 (2)
2007年9月 (3)
2007年8月 (6)
2007年7月 (3)
2007年6月 (9)
2007年5月 (6)
2007年4月 (2)
2007年3月 (11)
2007年2月 (10)
2007年1月 (6)
2006年12月 (30)
2006年11月 (7)
2006年10月 (11)
2006年9月 (18)
2006年8月 (31)
2006年7月 (8)
2006年6月 (5)
2006年5月 (1)
2006年4月 (19)
2006年3月 (10)
最新随笔
1. nodejs将对象转换成字符串代码,动态执行字符串代码,requirejs使用r.js打包时动态生成配置文件
2. java keytool证书工具使用小结
3. 移动端Web开发调试之Chrome远程调试(Remote Debugging)
4. Genymotion 解决虚拟镜像下载速度特别慢的问题
5. ubuntu mate 下的sublime text 3调用中文输入法的修改
6. Java 和 HTTP 的那些事(二) 使用代理
7. 正则表达式复杂应用
8. maven 依赖打包插件
9. 使用embeded tomcat进行嵌入式javaee开发-启动tomcat
10. Secure Kafka Java Producer with Kerberos
11. Kerberos 配置
12. ubuntu kerberos配置
13. kerberos安装配置
14. Apache Kafka Security 101
15. MySQL分库分表的全局唯一ID生成器方案
16. java修改static final常量值
17. MYSQL之表分区----按日期分区
18. Max MQTT connections
19. HDFS配置Kerberos认证
20. Spark History Server配置使用
21. Spark On Yarn中spark.yarn.jar属性的使用
22. Benchmarking Apache Kafka: 2 Million Writes Per Second (On Three Cheap Machines)
23. Kafka 高性能吞吐揭秘
24. JAVA实现gif图片缩放与剪切功能
25. 基于Redis实现分布式锁
26. Spring 动态注册类
27. 模块化利器: 一篇文章掌握RequireJS常用知识
28. 浅谈Spark应用程序的性能调优
29. playframwork dist 打包时将非项目中的文件也打包进去
30. 利用中文数据跑Google开源项目word2vec
搜索
积分与排名
积分 - 1389152
排名 - 16
最新评论
1. re: 用javascript与java进行RSA加密与解密[未登录]
谢谢, 正在研究这块
--付琪
2. re: 关于Hibernate一对一不能延迟加载的总结
评论内容较长,点击标题查看
--哈
3. re: AJAX+jsp无刷新验证码实例
达到
--李迪
4. re: 关于Hibernate一对一不能延迟加载的总结
很6啊
--一个陌生人
5. re: 字符串相似度算法[未登录]
注释的挺不错,赞一个。也给楼上点个赞:
org.apache.commons.lang.StringUtils.getLevenshteinDistance
中是有实现。
--lili
阅读排行榜
1. JQuery-Dialog(弹出窗口,遮蔽窗口)(108432)
2. JTree用法及JTree使用经验总结(46232)
3. tesseract-ocr识别中文扫描图片实例讲解 (46142)
4. window.close关闭窗口,不弹出系统提示,直接关闭(43563)
5. CKeditor 配置使用(42005)
评论排行榜
1. window.close关闭窗口,不弹出系统提示,直接关闭(18)
2. tesseract-ocr识别中文扫描图片实例讲解 (15)
3. CKeditor 配置使用(10)
4. JQuery-Dialog(弹出窗口,遮蔽窗口)(10)
5. 我写的javascript常用静态方法类,分享大家(8)
Http学习之使用HttpURLConnection发送post和get请求
http://blog.csdn.net/totogogo/article/details/1831588
http://blog.csdn.net/pandazxx/article/details/1657109
http://blog.csdn.net/pandazxx/article/details/1660008
最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解soap,和编写servlet的自动测试代码都有很大的帮助。
下面的代码简单描述了如何使用HttpURLConnection发起这两种请求,以及传递参数的方法:
public
class
HttpInvoker
{
public
static
final
String GET_URL
=
"
http://localhost:8080/welcome1
"
;
public
static
final
String POST_URL
=
"
http://localhost:8080/welcome1
"
;
public
static
void
readContentFromGet()
throws
IOException
{
//
拼凑get请求的URL字串,使用URLEncoder.encode对特殊和不可见字符进行编码
String getURL
=
GET_URL
+
"
?username=
"
+
URLEncoder.encode(
"
fat man
"
,
"
utf-8
"
);
URL getUrl
=
new
URL(getURL);
//
根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,
//
返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnection
HttpURLConnection connection
=
(HttpURLConnection) getUrl
.openConnection();
//
进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
//
服务器
connection.connect();
//
取得输入流,并使用Reader读取
BufferedReader reader
=
new
BufferedReader(
new
InputStreamReader(
connection.getInputStream()));
System.out.println(
"
=============================
"
);
System.out.println(
"
Contents of get request
"
);
System.out.println(
"
=============================
"
);
String lines;
while
((lines
=
reader.readLine())
!=
null
)
{
System.out.println(lines);
}
reader.close();
//
断开连接
connection.disconnect();
System.out.println(
"
=============================
"
);
System.out.println(
"
Contents of get request ends
"
);
System.out.println(
"
=============================
"
);
}
public
static
void
readContentFromPost()
throws
IOException
{
//
Post请求的url,与get不同的是不需要带参数
URL postUrl
=
new
URL(POST_URL);
//
打开连接
HttpURLConnection connection
=
(HttpURLConnection) postUrl
.openConnection();
//
Output to the connection. Default is
//
false, set to true because post
//
method must write something to the
//
connection
//
设置是否向connection输出,因为这个是post请求,参数要放在
//
http正文内,因此需要设为true
connection.setDoOutput(
true
);
//
Read from the connection. Default is true.
connection.setDoInput(
true
);
//
Set the post method. Default is GET
connection.setRequestMethod(
"
POST
"
);
//
Post cannot use caches
//
Post 请求不能使用缓存
connection.setUseCaches(
false
);
//
This method takes effects to
//
every instances of this class.
//
URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。
//
connection.setFollowRedirects(true);
//
This methods only
//
takes effacts to this
//
instance.
//
URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数
connection.setInstanceFollowRedirects(
true
);
//
Set the content type to urlencoded,
//
because we will write
//
some URL-encoded content to the
//
connection. Settings above must be set before connect!
//
配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
//
意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode
//
进行编码
connection.setRequestProperty(
"
Content-Type
"
,
"
application/x-www-form-urlencoded
"
);
//
连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
//
要注意的是connection.getOutputStream会隐含的进行connect。
connection.connect();
DataOutputStream out
=
new
DataOutputStream(connection
.getOutputStream());
//
The URL-encoded contend
//
正文,正文内容其实跟get的URL中'?'后的参数字符串一致
String content
=
"
firstname=
"
+
URLEncoder.encode(
"
一个大肥人
"
,
"
utf-8
"
);
//
DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面
out.writeBytes(content);
out.flush();
out.close();
//
flush and close
BufferedReader reader
=
new
BufferedReader(
new
InputStreamReader(
connection.getInputStream()));
String line;
System.out.println(
"
=============================
"
);
System.out.println(
"
Contents of post request
"
);
System.out.println(
"
=============================
"
);
while
((line
=
reader.readLine())
!=
null
)
{
System.out.println(line);
}
System.out.println(
"
=============================
"
);
System.out.println(
"
Contents of post request ends
"
);
System.out.println(
"
=============================
"
);
reader.close();
connection.disconnect();
}
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
//
TODO Auto-generated method stub
try
{
readContentFromGet();
readContentFromPost();
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的
readContentFromGet()函数产生了一个get请求,传给servlet一个username参数,值为"fat man"。
readContentFromPost()函数产生了一个post请求,传给servlet一个firstname参数,值为"一个大肥人"。
HttpURLConnection.connect函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到
HttpURLConnection
.getInputStream()这个函数里面才正式发送出去。
在
readContentFromPost() 中,顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对 outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。
http 请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content,在connect()函 数里面,会根据HttpURLConnection对象的配置值生成http头,因此在调用connect函数之前,就必须把所有的配置准备好。
紧接着http头的是http请求的正文,正文的内容通过outputStream写入,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是在流关闭后,根据输入的内容生成http正文。
至 此,http请求的东西已经准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个 输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正 文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入 outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。
posted on 2013-11-14 17:03
SIMONE
阅读(437)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理