最经常使用的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正文的长度,这种模式适用于向服务器传送较大的或者是不容易获取长度的数据,如文件。
服务器