JAVA的net发送_通过java.net.URLConnection发送HTTP请求的方法

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 parameters,Map 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();

}

}

原文:http://my.oschina.net/u/1425545/blog/493276

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值