最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解soap,和编写servlet的自动测试代码都有很大的帮助。
下面的代码简单描述了如何使用HttpURLConnection发起这两种请求,以及传递参数的方法:
上面的
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(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生
上节说道,post请求的OutputStream实际上不是网络流,而是写入内存,在getInputStream中才真正把写道流里面的内容作为正文与根据之前的配置生成的http request头合并成真正的http request,并在此时才真正向服务器发送。
HttpURLConnection.setChunkedStreamingMode 函数可以改变这个模式,设置了ChunkedStreamingMode后,不再等待OutputStream关闭后生成完整的http request一次过发送,而是先发送http request头,正文内容则是网路流的方式实时传送到服务器。实际上是不告诉服务器http正文的长度,这种模式适用于向服务器传送较大的或者是不容易获取长度的数据,如文件。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
publicstaticvoidreadContentFromChunkedPost()throwsIOException{
URLpostUrl=newURL(POST_URL);
HttpURLConnectionconnection=(HttpURLConnection)postUrl
.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
/**//*
*与readContentFromPost()最大的不同,设置了块大小为5字节
*/
connection.setChunkedStreamingMode(5);
connection.connect();
/**//*
*注意,下面的getOutputStream函数工作方式于在readContentFromPost()里面的不同
*在readContentFromPost()里面该函数仍在准备httprequest,没有向服务器发送任何数据
*而在这里由于设置了ChunkedStreamingMode,getOutputStream函数会根据connect之前的配置
*生成httprequest头,先发送到服务器。
*/
DataOutputStreamout=newDataOutputStream(connection
.getOutputStream());
Stringcontent="firstname="+URLEncoder.encode("一个大肥人"+
""+
"asdfasfdasfasdfaasdfasdfasdfdasfs","utf-8");
out.writeBytes(content);
out.flush();
out.close();//到此时服务器已经收到了完整的httprequest了,而在readContentFromPost()函数里,要等到下一句服务器才能收到http请求。
BufferedReaderreader=newBufferedReader(newInputStreamReader(
connection.getInputStream()));
out.flush();
out.close();//flushandclose
Stringline;
System.out.println("=============================");
System.out.println("Contentsofpostrequest");
System.out.println("=============================");
while((line=reader.readLine())!=null){
System.out.println(line);
}
System.out.println("=============================");
System.out.println("Contentsofpostrequestends");
System.out.println("=============================");
reader.close();
connection.disconnect();
}
分享到:
相关推荐
android Handler Thread AsyncTask httpURLConnection学习的代码
HttpURLConnection的demo,里面有网络请求get post 上传文件,下载文件,介绍HttpURLConnection这个类整体流程是怎样使用的,方便初学者学习
xamarin学习笔记A15(安卓OkHttp3和HttpURLConnection)上
xamarin学习笔记A16(安卓OkHttp3和HttpURLConnection)下
主要介绍了JAVA中的HttpURLConnection用法,文中讲解非常细致,供大家参考和学习,感兴趣的朋友可以了解下
http请求在Android开发中是必不可少的,现在我写了一个关于http get请求文本数据的例子希望能和大家交流学习
NULL 博文链接:https://zjutsoft.iteye.com/blog/1313754
主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧
以下是学习中的一些经验。 1、HttpURLConnection接口 首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http...
Android学习笔记 > 十年生死两茫茫,不思量,自难忘,华年短暂,陈辞岁月悠悠伤, > 满腔热血已芜荒,展未来,后生强,战战兢兢,如履薄冰心彷徨, > 青丝化雪、鬓角成霜,已是英雄迟暮,人生怎慷慨激昂? 目录 ...
HttpClient和HttpURLConnection那篇的学习代码
它默认使用HttpUrlConnection去下载网络图片,你也可以使用库中已实现的OkhttpImageLoader或者自定义你的ImageLoader因为这个库提供了接口。 注意:这是一个用于学习图片加载与缓存的库,不推荐使用在实际项目之中...
通过这个Android源码可学习一下如何基于Java代码实现断点续传的应用,比如如何设置当前线程下载的起点、终点,设置断点续传的开始位置,设置User-Agent ,httpURLConnection.setRequestProperty("User-Agent",...
网络获取图片—httpurlconnection和bitmapfactroy的学习。以及weight的用法主要有3种
是个人基于HttpURLConnection 实现http 请求; Json 主要仿照 开源JSON; 当然common也会存放一些其他模块使用的JavaBean、annotation等; api-gateway 这功能貌似比较新颖,采用servlet+spring 方式进行 将 Spring-...
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信...
根据本讲学习内容,学会应用HttpURLConnection、JSON数据解析以及联动Spinner实现简单天气查询。 (1) 提交的作业包中含有应用程序运行效果截图。
使用HttpURLConnection AsyncTask访问webservice接口(返回json字符串).rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
介绍了android调用.net上创建的webservice的详细过程。其中介绍了webservice在vs2010上的创建及注意事项;eclipse上配置android开发 ...办法,适用于开始学习android及开始学习webservice的相关开发人员
这是一个简单调用第三方接口的小demo,实现与图灵机器人互动聊天的小功能,用到了httpurlconnection,json解析,很好的展现了网络获取数据的例子,值的学习!