简单介绍Java网络编程中的HTTP请求
http请求的细节——请求行
请求行中的get称之为请求方式,请求方式有:post、get、head、options、delete、trace、put,常用的有: get、 post
用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管post或get,都用于向服务器请求某个web资源,这两种方式的区别主要表现在数据传递上:如果请求方式为get方式,则可以在请求的url地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:get /mail/1.html?name=abc&password=xyz http/1.1
get方式的特点:在url地址后附带的参数是有限制的,其数据容量通常不能超过1k。
如果请求方式为post方式,则可以在请求的实体内容中向服务器发送数据,post方式的特点:传送的数据量无限制。
http请求的细节——消息头
http请求中的常用消息头
accept:浏览器通过这个头告诉服务器,它所支持的数据类型
accept-charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
accept-encoding:浏览器通过这个头告诉服务器,支持的压缩格式
accept-language:浏览器通过这个头告诉服务器,它的语言环境
host:浏览器通过这个头告诉服务器,想访问哪台主机
if-modified-since: 浏览器通过这个头告诉服务器,缓存数据的时间
referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
例:
http_get
import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.net.httpurlconnection; import java.net.malformedurlexception; import java.net.url; public class http_get { private static string url_path = "http://192.168.1.125:8080/myhttp/pro1.png"; public http_get() { // todo auto-generated constructor stub } public static void saveimagetodisk() { inputstream inputstream = getinputstream(); byte[] data = new byte[1024]; int len = 0; fileoutputstream fileoutputstream = null; try { fileoutputstream = new fileoutputstream("c:\\test.png"); while ((len = inputstream.read(data)) != -1) { fileoutputstream.write(data, 0, len); } } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } finally { if (inputstream != null) { try { inputstream.close(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } if (fileoutputstream != null) { try { fileoutputstream.close(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } } } /** * 获得服务器端的数据,以inputstream形式返回 * @return */ public static inputstream getinputstream() { inputstream inputstream = null; httpurlconnection httpurlconnection = null; try { url url = new url(url_path); if (url != null) { httpurlconnection = (httpurlconnection) url.openconnection(); // 设置连接网络的超时时间 httpurlconnection.setconnecttimeout(3000); httpurlconnection.setdoinput(true); // 表示设置本次http请求使用get方式请求 httpurlconnection.setrequestmethod("get"); int responsecode = httpurlconnection.getresponsecode(); if (responsecode == 200) { // 从服务器获得一个输入流 inputstream = httpurlconnection.getinputstream(); } } } catch (malformedurlexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } return inputstream; } public static void main(string[] args) { // 从服务器获得图片保存到本地 saveimagetodisk(); } }
http_post
import java.io.bytearrayoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.io.unsupportedencodingexception; import java.net.httpurlconnection; import java.net.malformedurlexception; import java.net.url; import java.net.urlencoder; import java.util.hashmap; import java.util.map; public class http_post { // 请求服务器端的url private static string path = "http://192.168.1.125:8080/myhttp/servlet/loginaction"; private static url url; public http_post() { // todo auto-generated constructor stub } static { try { url = new url(path); } catch (malformedurlexception e) { // todo auto-generated catch block e.printstacktrace(); } } /** * @param params * 填写的url的参数 * @param encode * 字节编码 * @return */ public static string sendpostmessage(map<string, string> params, string encode) { // 作为stringbuffer初始化的字符串 stringbuffer buffer = new stringbuffer(); try { if (params != null && !params.isempty()) { for (map.entry<string, string> entry : params.entryset()) { // 完成转码操作 buffer.append(entry.getkey()).append("=").append( urlencoder.encode(entry.getvalue(), encode)) .append("&"); } buffer.deletecharat(buffer.length() - 1); } // system.out.println(buffer.tostring()); // 删除掉最有一个& system.out.println("-->>"+buffer.tostring()); httpurlconnection urlconnection = (httpurlconnection) url .openconnection(); urlconnection.setconnecttimeout(3000); urlconnection.setrequestmethod("post"); urlconnection.setdoinput(true);// 表示从服务器获取数据 urlconnection.setdooutput(true);// 表示向服务器写数据 // 获得上传信息的字节大小以及长度 byte[] mydata = buffer.tostring().getbytes(); // 表示设置请求体的类型是文本类型 urlconnection.setrequestproperty("content-type", "application/x-www-form-urlencoded"); urlconnection.setrequestproperty("content-length", string.valueof(mydata.length)); // 获得输出流,向服务器输出数据 outputstream outputstream = urlconnection.getoutputstream(); outputstream.write(mydata,0,mydata.length); outputstream.close(); // 获得服务器响应的结果和状态码 int responsecode = urlconnection.getresponsecode(); if (responsecode == 200) { return changeinputstream(urlconnection.getinputstream(), encode); } } catch (unsupportedencodingexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } return ""; } /** * 将一个输入流转换成指定编码的字符串 * * @param inputstream * @param encode * @return */ private static string changeinputstream(inputstream inputstream, string encode) { // todo auto-generated method stub bytearrayoutputstream outputstream = new bytearrayoutputstream(); byte[] data = new byte[1024]; int len = 0; string result = ""; if (inputstream != null) { try { while ((len = inputstream.read(data)) != -1) { outputstream.write(data, 0, len); } result = new string(outputstream.tobytearray(), encode); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } return result; } /** * @param args */ public static void main(string[] args) { // todo auto-generated method stub map<string, string> params = new hashmap<string, string>(); params.put("username", "admin"); params.put("password", "123"); string result = http_post.sendpostmessage(params, "utf-8"); system.out.println("--result->>" + result); } }