1、GET与POST请求的区别
a) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
2、URLConnection的对象
a) 获取URLConnection实例
URL url = new URL(urlString); // 根据url生成urlConnection对象 urlConnection = (HttpURLConnection) url.openConnection();
b) 常见参数设置
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 // http正文内,因此需要设为true, 默认情况下是false; httpUrlConnection.setDoOutput(true); // 设置是否从httpUrlConnection读入,默认情况下是true; httpUrlConnection.setDoInput(true); // Post 请求不能使用缓存 httpUrlConnection.setUseCaches(false); // 设定传送的内容类型是可序列化的java对象 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object"); // 设定请求的方法为"POST",默认是GET httpUrlConnection.setRequestMethod("POST"); //设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。 System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串); System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);
c) HttpURLConnection写数据与发送数据问题
// 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。 OutputStream outStrm = httpUrlConnection.getOutputStream(); ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); // 向对象输出流写出数据,这些数据将存到内存缓冲区中 objOutputStrm.writeObject(new String("我是测试数据")); // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream) objOutputStm.flush(); // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中, // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器 objOutputStm.close(); // 调用HttpURLConnection连接对象的getInputStream()函数, // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。 InputStream inStrm = httpConn.getInputStream(); // <===注意,实际发送请求的代码段就在这里 // 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义// 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流写入任何数据. // 因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据、 // 重新发送数据(至于是否不用重新这些操作需要再研究) objOutputStm.writeObject(new String("")); httpConn.getInputStream();
3、代码实例
package org.zhangsm.httpRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; /** * 使用Java原生的API发送Http请求,即java.net.URL、java.net.URLConnection。 * 步骤如下: * 1、通过统一资源定位符获取连接器 * 2、设置请求的参数 * 3、以输入流的形式获取返回内容 * 4、关闭输入流 * @author zhang.shuming * */ public class HttpRequest { public static void main(String[] args) throws Exception { System.out.println(send("http://www.baidu.com", "GET", null, null)); } private static String send(String urlString,String method, Map<String,String> parameters,Map<String,String> propertys) throws Exception{ HttpURLConnection urlConnection = null; if(method.equalsIgnoreCase("GET") && parameters != null){ StringBuffer param = new StringBuffer(); int i = 0; for(String key : parameters.keySet()){ if(i == 0) param.append("?"); else param.append("&"); param.append(key).append("=").append(parameters.get(key)); i++; } urlString += param; } URL url = new URL(urlString); // 根据url生成urlConnection对象 urlConnection = (HttpURLConnection) url.openConnection(); // 设置参数 urlConnection.setRequestMethod(method); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.setUseCaches(false); if(propertys != null){ for(String key : propertys.keySet()){ urlConnection.addRequestProperty(key, propertys.get(key)); } } if(method.equalsIgnoreCase("POST") && parameters != null){ StringBuffer param = new StringBuffer(); for(String key : parameters.keySet()){ param.append("&"); param.append(key).append("=").append(parameters.get(key)); } urlConnection.getOutputStream().write(param.toString().getBytes()); urlConnection.getOutputStream().flush(); urlConnection.getOutputStream().close(); } return makeContent(urlString,urlConnection); } private static String makeContent(String urlString,HttpURLConnection urlConnection) throws IOException{ InputStream in = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); StringBuffer temp = new StringBuffer(); String line; while((line = bufferedReader.readLine()) != null){ temp.append(line); } bufferedReader.close(); return temp.toString(); } }
时间: 2024-09-30 01:22:57