使用HttpClient发送Post Http请求

最近需要使用java对Rest接口进行调用,也就是直接使用java直接发送Post, Get, Put, Delete等请求。

印象中可以使用Apache Common下的HttpClient来做,结果HttpClient已经独立成了HttpComponent,编码方式也有所改变。

Google出来的很多文章多数是common-httpclient的方式,在新版本中不怎么适用。经过一番研究自己做了一下封装:

 

 

package cn.com.dayang.auth;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;


public class HttpXmlClient {
	private static Logger log = Logger.getLogger(HttpXmlClient.class);
	
	public static String post(String url, Map<String, String> params) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String body = null;
		
		log.info("create httppost:" + url);
		HttpPost post = postForm(url, params);
		
		body = invoke(httpclient, post);
		
		httpclient.getConnectionManager().shutdown();
		
		return body;
	}
	
	public static String get(String url) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String body = null;
		
		log.info("create httppost:" + url);
		HttpGet get = new HttpGet(url);
		body = invoke(httpclient, get);
		
		httpclient.getConnectionManager().shutdown();
		
		return body;
	}
		
	
	private static String invoke(DefaultHttpClient httpclient,
			HttpUriRequest httpost) {
		
		HttpResponse response = sendRequest(httpclient, httpost);
		String body = paseResponse(response);
		
		return body;
	}

	private static String paseResponse(HttpResponse response) {
		log.info("get response from http server..");
		HttpEntity entity = response.getEntity();
		
		log.info("response status: " + response.getStatusLine());
		String charset = EntityUtils.getContentCharSet(entity);
		log.info(charset);
		
		String body = null;
		try {
			body = EntityUtils.toString(entity);
			log.info(body);
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return body;
	}

	private static HttpResponse sendRequest(DefaultHttpClient httpclient,
			HttpUriRequest httpost) {
		log.info("execute post...");
		HttpResponse response = null;
		
		try {
			response = httpclient.execute(httpost);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return response;
	}

	private static HttpPost postForm(String url, Map<String, String> params){
		
		HttpPost httpost = new HttpPost(url);
		List<NameValuePair> nvps = new ArrayList <NameValuePair>();
		
		Set<String> keySet = params.keySet();
		for(String key : keySet) {
			nvps.add(new BasicNameValuePair(key, params.get(key)));
		}
		
		try {
			log.info("set utf-8 form entity to httppost");
			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return httpost;
	}
}

 

 

如何调用:

 

 

		Map<String, String> params = new HashMap<String, String>();
		params.put("name", name);
		params.put("password", password);
			
		String xml = HttpXmlClient.post(loginUrl, params);
		log.info(xml);

 

 

参考资料:

HttpComponents Client GA主页

官方提供的入门文档

官方提供的Examples(这个最直接)

 

 

Ruby发送请求的方式

还是喜欢Ruby的发http请求的方式,本来想在项目中集成Groovy, 时间关系直接用java实现了

 

require "net/http"
require "rexml/document"
require "iconv"

puts 'read test xml from file...'
file = File.open('task.xml')
doc = REXML::Document.new file

xml = doc.to_s #document to xml string
cov=Iconv.new('gbk', 'utf-8')#create encoder
encodedXml = cov.iconv(xml)#encoding zh_CN
puts encodedXml #display log

params= {}
params["msg"]=xml
#post http request
uri = URI.parse("http://localhost:8080/monitor/client/message")

1.upto 2 do	|i|	
	puts 'send time:' + i.to_s
	
	res = Net::HTTP.post_form(uri, params)
end


 

 

<think> 首先,用户的问题是关于使用HttpClient发送POST表单请求的方法。用户参考了引用[1],其中描述了一个HttpClient发送POST请求的例子,包括创建HttpClientHttpPost对象、设置URL、请求体、请求头等。 回顾引用[1]的关键点: - 创建HttpClient对象 - 创建HttpPost对象并设置URL - 设置请求体(body) - 设置请求头信息(如Content-Type) - 执行请求并获取响应 - 使用EntityUtils处理响应 - 关闭HttpClient 用户明确提到“发送post表单请求”,这意味着请求体应该是表单数据,通常格式为application/x-www-form-urlencoded或multipart/form-data。在引用[1]中,它提到了Content-Type指定请求体的数据格式,但没有具体说明表单格式。用户需要的是表单请求的实现方法。 我的回答需要: - 使用中文回答 - 结构清晰,逐步解决问题 - 保证真实可靠(基于标准HttpClient知识) - 遵循系统级指令:行内数学表达式用$...$,独立公式用$$...$$(但这里可能不涉及数学,所以保持空白) - 生成相关问题 - 末尾添加引用标识 用户上一次的问题是“我想查找使用httpClient发送post表单请求的方法”,所以我的回答应聚焦于此。 实现HttpClient发送POST表单请求的方法: 1. 使用HttpClient库(这里是Apache HttpClient)。 2. 对于表单数据,通常使用UrlEncodedFormEntity或MultipartEntityBuilder,取决于表单类型。 - application/x-www-form-urlencoded:用于键值对数据。 - multipart/form-data:用于文件上传。 3. 步骤: - 创建HttpClient实例。 - 创建HttpPost对象并设置URL。 - 创建一个List<NameValuePair>或类似结构来存储表单参数。 - 使用UrlEncodedFormEntity包装参数列表。 - 设置请求实体到HttpPost。 - 设置Content-Type头部(通常UrlEncodedFormEntity会自动设置)。 - 执行请求。 - 处理响应。 - 关闭资源。 确保回答可靠:Apache HttpClient是常见的Java库,我会基于标准用法描述。 回答结构: - 先简要介绍。 - 然后逐步解释实现步骤。 - 提供代码示例(虽然不是必须,但用户可能期望)。 - 结束时生成相关问题。 - 添加引用标识。 生成相关问题:基于主题,如常见错误、优化方法、其他请求类型等。 最后,引用标识:在引用部分添加[^1],如结尾。 用户参考了引用[1],但它是关于POST请求的一般示例,不是特定表单。我应基于用户需求回答。 完整回答大纲: 1. 介绍:HttpClient发送POST表单请求的方法。 2. 步骤: a. 创建HttpClient实例。 b. 创建HttpPost对象。 c. 准备表单参数。 d. 设置请求实体。 e. 可选设置请求头。 f. 执行请求。 g. 处理响应。 h. 关闭资源。 3. 代码示例(用代码块,类似示例中的Python代码)。 4. 生成相关问题。 5. 引用标识。 代码示例使用Java,因为HttpClientJava库。 代码框架: ```java import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.List; public class HttpClientFormPost { public static void main(String[] args) throws Exception { // 创建HttpClient实例 try (CloseableHttpClient httpClient = HttpClients.createDefault()) { // 创建HttpPost对象并设置URL HttpPost httpPost = new HttpPost("http://example.com/form"); // 准备表单参数 List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("key1", "value1")); params.add(new BasicNameValuePair("key2", "value2")); // 设置请求实体 httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); // 可选:设置请求头,UrlEncodedFormEntity默认设置Content-Type为application/x-www-form-urlencoded // 执行请求 try (CloseableHttpResponse response = httpClient.execute(httpPost)) { // 处理响应 HttpEntity entity = response.getEntity(); if (entity != null) { String responseString = EntityUtils.toString(entity); System.out.println(responseString); } } } } } ``` 在描述中,解释关键点。 生成相关问题: 1. 发送表单请求时如何处理文件上传? 2. 如何设置超时或其他配置? 3. HttpClient发送POST请求的常见错误有哪些? 引用标识:在末尾添加[^1],因为用户提供了引用。 确保中文回答:整个回答用中文。 </think> ### HttpClient发送POST表单请求的实现方法 在Java使用Apache HttpClient发送POST表单请求是一种常见操作,主要适用于处理`application/x-www-form-urlencoded`格式的表单数据(如键值对参数)。下面是清晰的实现步骤和代码示例,基于Apache HttpClient库(版本4.x或5.x)。实现的核心是使用`UrlEncodedFormEntity`封装表单参数,并正确设置请求头和URL[^1]。 #### 步骤详解 1. **创建HttpClient对象**:使用`HttpClients.createDefault()`初始化一个HTTP客户端。 2. **创建HttpPost对象**:指定目标URL。 3. **准备表单参数**:使用`List<NameValuePair>`存储键值对数据。 4. **设置请求实体**:用`UrlEncodedFormEntity`包装参数列表,指定编码(如UTF-8)。 5. **设置请求头**:添加`Content-Type`为`application/x-www-form-urlencoded`(自动设置时可省略)。 6. **执行请求**:通过`httpClient.execute(httpPost)`发送请求。 7. **处理响应**:使用`EntityUtils.toString()`将响应实体转换为字符串。 8. **关闭资源**:在`finally`块中释放连接。 #### 完整代码示例 ```java import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.List; public class HttpClientFormPostDemo { public static void main(String[] args) { // 1. 创建HttpClient对象 try (CloseableHttpClient httpClient = HttpClients.createDefault()) { // 2. 创建HttpPost对象并设置URL HttpPost httpPost = new HttpPost("https://api.example.com/submit"); // 3. 准备表单参数(键值对) List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("username", "user123")); params.add(new BasicNameValuePair("password", "pass@456")); params.add(new BasicNameValuePair("action", "login")); // 4. 设置请求实体(表单数据) httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); // 5. 可选:显式设置Content-Type(UrlEncodedFormEntity默认设置) // httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); // 6. 执行请求并获取响应 try (CloseableHttpResponse response = httpClient.execute(httpPost)) { // 7. 处理响应 String responseBody = EntityUtils.toString(response.getEntity()); System.out.println("响应状态码: " + response.getStatusLine().getStatusCode()); System.out.println("响应内容: " + responseBody); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 关键说明 - **表单格式**:此方法适用于`application/x-www-form-urlencoded`,参数以`key=value&key2=value2`形式编码。 - **编码处理**:始终指定字符编码(如UTF-8)避免乱码。 - **资源管理**:使用try-with-resources自动关闭`HttpClient`和`HttpResponse`。 - **错误处理**:在生产代码中添加异常捕获(如`IOException`)。 - **性能优化**:复用`HttpClient`实例减少连接开销[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值