通过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<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

通过java.net.URLConnection发送HTTP请求的方法的相关文章

【Stackoverflow问题精选】如何使用java.net.URLConnection收发HTTP请求

问题 如何使用java.net.URLConnection收发HTTP请求呢?处理Http请求,有哪些最佳实践? 讨论: 精华回答 首先声明,下面的代码,都是基本的例子.更严谨的话,还应加入处理各种异常的代码(如IOExceptions.NullPointerException.ArrayIndexOutOfBoundsException) 准备 首先,需要设置请求的URL以及charset(编码):另外还需要哪些参数,则取决于各自url的要求. String url = "http://exa

java使用httpcomponents发送get请求

一.适用场景 在ESTful webservice中,get方法一般都是用来获取数据.我们可以使用httpcomponents组件来完成调用. 如我们需要发起get请求,携带的参数都是附加到请求的url后面. url:"http://www.xxxxx.com/message?id=000010" 二.代码示例 1 package com.demo.test; 2 3 import java.io.IOException; 4 5 import org.apache.http.Http

Android URLConnection发送Get请求 HttpGet封装

一.使用URLConnection发送Get请求 1.与服务器建立连接: URLConnection connection=new URL("https://www.baidu.com/").openConnection(); 2.设置请求头(Cookie亦可通过请求头设置): connection.setRequestProperty("Referer","https://www.baidu.com/"); connection.setRequ

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

【JAVA】通过URLConnection/HttpURLConnection发送HTTP请求的方法

Java原生的API可用于发送HTTP请求 即java.net.URL.java.net.URLConnection,JDK自带的类: 1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection) 2.设置请求的参数 3.发送请求 4.以输入流的形式获取返回内容 5.关闭输入流 封装请求类 1 package com.util; 2 3 import java.io.BufferedReader; 4 import java.io.IOExcept

java 实现HttpRequest 发送http请求

package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; public class h

Hbuilder MUI里面使用java.net.URL发送网络请求,操作cookie

1. 引入所需网络请求类: var URL = plus.android.importClass("java.net.URL"); var URLConnection = plus.android.importClass("java.net.URLConnection"); var BufferedReader = plus.android.importClass("java.io.BufferedReader"); var InputStrea

【JAVA】通过HttpClient发送HTTP请求的方法

HttpClient介绍 HttpClient 不是一个浏览器.它是一个客户端的 HTTP 通信实现库.HttpClient的目标是发 送和接收HTTP 报文.HttpClient不会去缓存内容,执行 嵌入在 HTML 页面中的javascript 代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和 HTTP 运输无关的功能. HttpClient使用 使用需要引入jar包,maven项目引入如下: 1 <dependency> 2 <groupId>org.apache

Java -- 通过 URLConnection 进行http请求中文乱码

对writer和reader指定字符集 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")); in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); 具体代码: public static String sendPost(String url, String