在发送HTTP请求的时候会使用到POST和GET两种方式,如果是传送普通的表单数据,我们直接将参数到一个Key-value形式的Map中即可,随着JSON的应用越来越广,我们在很多场合需要传送JSON格式的参数。
下面我使用HttpClient类库提供的功能来实现这个,以便以后参考。
一.完善SpringMVC工程
完善SpringMVC工程(修改之前的Spring工程地址:http://bijian1013.iteye.com/blog/2307353),使其不仅支持GET、POST两种方式的请求,且支持普通表单数据请求和JSON格式的两种请求数据,完整工程代码见附件《SpringMVC.zip》,日志相关的依赖jar包可直接从HttpClient.zip中获取到。
@Controller public class HelloController { private static Logger logger = LoggerFactory.getLogger(HelloController.class); @Autowired private HelloService helloService; @RequestMapping("/greeting") public ModelAndView greeting(@RequestParam(value = "name", defaultValue = "World") String name) { Map<String, Object> map = new HashMap<String, Object>(); try { //由于浏览器会把中文直接换成ISO-8859-1编码格式,如果用户在地址打入中文,需要进行如下转换处理 String tempName = new String(name.getBytes("ISO-8859-1"), "utf-8"); logger.trace("tempName:" + tempName); logger.info(tempName); String userName = helloService.processService(tempName); map.put("userName", userName); logger.trace("运行结果:" + map); } catch (UnsupportedEncodingException e) { logger.error("HelloController greeting方法发生UnsupportedEncodingException异常:" + e); } catch (Exception e) { logger.error("HelloController greeting方法发生Exception异常:" + e); } return new ModelAndView("/hello", map); } @RequestMapping(value="/processing", method = RequestMethod.POST) public ModelAndView processing(HttpServletRequest request, HttpServletResponse response) { Enumeration en = request.getParameterNames(); while (en.hasMoreElements()) { String paramName = (String) en.nextElement(); String paramValue = request.getParameter(paramName); } String name = request.getParameter("name"); String age = request.getParameter("age"); UserDTO userDTO = new UserDTO(); userDTO.setName(name); userDTO.setAge(Integer.valueOf(age)); logger.info("process param is :{}" + userDTO); Map<String, Object> map = new HashMap<String, Object>(); try { userDTO = helloService.processService(userDTO); //返回请求结果 map.put("name", userDTO.getName()); map.put("age", userDTO.getAge()); } catch (Exception e) { logger.info("请求处理异常:" + e); } return new ModelAndView("/user", map); } /** * @responseBody表示该方法的返回结果直接写入HTTP response body中 * 一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径 * 加上@responseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。 * 比如异步获取json数据,加上@responsebody后,会直接返回json数据。 */ @ResponseBody @RequestMapping(value="/greet",method = RequestMethod.GET) public Map<String, Object> greet(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "name", defaultValue = "World") String name) { Map<String, Object> map = null; try { //由于浏览器会把中文直接换成ISO-8859-1编码格式,如果用户在地址打入中文,需要进行如下转换处理 String tempName = new String(name.getBytes("ISO-8859-1"), "utf-8"); logger.trace("tempName:" + tempName); logger.info(tempName); String userName = helloService.processService(tempName); map = new HashMap<String, Object>(); map.put("userName", userName); logger.trace("运行结果:" + map); } catch (UnsupportedEncodingException e) { logger.error("HelloController greet方法发生UnsupportedEncodingException异常:" + e); } catch (Exception e) { logger.error("HelloController greet方法发生Exception异常:" + e); } return map; } @ResponseBody @RequestMapping(value="/process",method = RequestMethod.POST) public String process(HttpServletRequest request, @RequestBody String requestBody) { logger.info("process param is :{}" + requestBody); JSONObject result = new JSONObject(); try { JSONObject jsonObject = JSONObject.fromObject(requestBody); UserDTO userDTO = (UserDTO) JSONObject.toBean(jsonObject, UserDTO.class); userDTO = helloService.processService(userDTO); //返回请求结果 result.put("status", "SUCCESS"); result.put("userDTO", userDTO); } catch (Exception e) { logger.info("请求处理异常! params is:{}", requestBody); result.put("status", "FAIL"); } return result.toString(); } }
二.HttpClient请求普通的表单数据,返回HTML页面
package com.bijian.study; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Map; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.http.client.methods.HttpPost; /** * Http请求工具类 * 请求的是普通的表单数据,返回HTML页面 * * 需要导入commons-codec-1.3.jar */ public class HttpClientUtil { /** * httpClient的get请求方式 * * @param url * @param charset * @return * @throws Exception */ public static String doGet(String url, String charset) throws Exception { HttpClient client = new HttpClient(); GetMethod method = new GetMethod(url); if (null == url || !url.startsWith("http")) { throw new Exception("请求地址格式不对"); } // 设置请求的编码方式 if (null != charset) { method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + charset); } else { method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + "utf-8"); } int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) {// 打印服务器返回的状态 System.out.println("Method failed: " + method.getStatusLine()); } // 返回响应消息 byte[] responseBody = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); // 在返回响应消息使用编码(utf-8或gb2312) String response = new String(responseBody, "utf-8"); System.out.println("------------------response:" + response); // 释放连接 method.releaseConnection(); return response; } /** * httpClient的get请求方式2 * * @param url * @param charset * @return * @throws Exception */ public static String doGet2(String url, String charset) throws Exception { /* * 使用 GetMethod 来访问一个 URL 对应的网页,实现步骤: 1:生成一个 HttpClinet 对象并设置相应的参数。 * 2:生成一个 GetMethod 对象并设置响应的参数。 3:用 HttpClinet 生成的对象来执行 GetMethod 生成的Get * 方法。 4:处理响应状态码。 5:若响应正常,处理 HTTP 响应内容。 6:释放连接。 */ /* 1 生成 HttpClinet 对象并设置参数 */ HttpClient httpClient = new HttpClient(); // 设置 Http 连接超时为5秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); /* 2 生成 GetMethod 对象并设置参数 */ GetMethod getMethod = new GetMethod(url); // 设置 get 请求超时为 5 秒 getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000); // 设置请求重试处理,用的是默认的重试处理:请求三次 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); String response = ""; /* 3 执行 HTTP GET 请求 */ try { int statusCode = httpClient.executeMethod(getMethod); /* 4 判断访问的状态码 */ if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: " + getMethod.getStatusLine()); } /* 5 处理 HTTP 响应内容 */ // HTTP响应头部信息,这里简单打印 Header[] headers = getMethod.getResponseHeaders(); for (Header h : headers) System.out.println(h.getName() + "------------ " + h.getValue()); // 读取 HTTP 响应内容,这里简单打印网页内容 byte[] responseBody = getMethod.getResponseBody();// 读取为字节数组 response = new String(responseBody, charset); System.out.println("----------response:" + response); // 读取为 InputStream,在网页内容数据量大时候推荐使用 // InputStream response = getMethod.getResponseBodyAsStream(); } catch (HttpException e) { // 发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("Please check your provided http address!"); e.printStackTrace(); } catch (IOException e) { // 发生网络异常 e.printStackTrace(); } finally { /* 6 .释放连接 */ getMethod.releaseConnection(); } return response; } /** * 执行一个HTTP POST请求,返回请求响应的HTML * * @param url 请求的URL地址 * @param params 请求的查询参数,可以为null * @param charset 字符集 * @param pretty 是否美化 * @return 返回请求响应的HTML */ public static String doPost(String url, Map<String, Object> _params, String charset, boolean pretty) { StringBuffer response = new StringBuffer(); HttpClient client = new HttpClient(); PostMethod method = new PostMethod(url); // 设置Http Post数据 if (_params != null) { for (Map.Entry<String, Object> entry : _params.entrySet()) { method.setParameter(entry.getKey(), String.valueOf(entry.getValue())); } } // 设置Http Post数据 方法二 // if(_params != null) { // NameValuePair[] pairs = new NameValuePair[_params.size()];//纯参数了,键值对 // int i = 0; // for (Map.Entry<String, Object> entry : _params.entrySet()) { // pairs[i] = new NameValuePair(entry.getKey(), String.valueOf(entry.getValue())); // i++; // } // method.addParameters(pairs); // } try { client.executeMethod(method); if (method.getStatusCode() == HttpStatus.SC_OK) { // 读取为 InputStream,在网页内容数据量大时候推荐使用 BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset)); String line; while ((line = reader.readLine()) != null) { if (pretty) response.append(line).append(System.getProperty("line.separator")); else response.append(line); } reader.close(); } } catch (IOException e) { System.out.println("执行HTTP Post请求" + url + "时,发生异常!"); e.printStackTrace(); } finally { method.releaseConnection(); } System.out.println("--------------------" + response.toString()); return response.toString(); } }
测试类HttpClientTest.java
package com.bijian.study; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HttpClientTest { private static Logger logger = LoggerFactory.getLogger(HttpRequestTest.class); public static void main(String[] args) { getRequestTest(); getRequestTest2(); postRequestTest(); } private static void getRequestTest() { String url = "http://localhost:8080/SpringMVC/greeting?name=lisi"; try { String str = HttpClientUtil.doGet(url, "UTF-8"); if (str != null) { logger.info("http Get request result:" + str); } else { logger.info("http Get request process fail"); } } catch (Exception e) { e.printStackTrace(); } } private static void getRequestTest2() { String url = "http://localhost:8080/SpringMVC/greeting?name=lisi"; try { String str = HttpClientUtil.doGet2(url, "UTF-8"); if (str != null) { logger.info("http Get request result:" + str); } else { logger.info("http Get request process fail"); } } catch (Exception e) { e.printStackTrace(); } } private static void postRequestTest() { String url = "http://localhost:8080/SpringMVC/processing"; Map<String, Object> _params = new HashMap<String, Object>(); _params.put("name", "zhangshang"); _params.put("age", 25); String str = HttpClientUtil.doPost(url, _params, "UTF-8", true); if (str != null) { logger.info("http Post request result:" + str); } else { logger.info("http Post request process fail"); } } }
三.HttpClient请求json数据返回json数据
package com.bijian.study; import java.io.IOException; import java.net.URLDecoder; import net.sf.json.JSONObject; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Http请求工具类,发送json返回json * * 除了要导入json-lib-2.1.jar之外,还必须有其它几个依赖包: * commons-beanutils.jar * commons-httpclient.jar * commons-lang.jar * ezmorph.jar * morph-1.0.1.jar * 另外,commons-collections.jar也需要导入 */ public class HttpRequestUtil { private static Logger logger = LoggerFactory.getLogger(HttpRequestUtil.class); /** * 发送get请求 * @param url 路径 * @return */ public static JSONObject httpGet(String url){ //get请求返回结果 JSONObject jsonResult = null; try { DefaultHttpClient client = new DefaultHttpClient(); //发送get请求 HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); /**请求发送成功,并得到响应**/ if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { /**读取服务器返回过来的json字符串数据**/ String strResult = EntityUtils.toString(response.getEntity()); /**把json字符串转换成json对象**/ jsonResult = JSONObject.fromObject(strResult); url = URLDecoder.decode(url, "UTF-8"); } else { logger.error("get请求提交失败:" + url); } } catch (IOException e) { logger.error("get请求提交失败:" + url, e); } return jsonResult; } /** * httpPost * @param url 路径 * @param jsonParam 参数 * @return */ public static JSONObject httpPost(String url,JSONObject jsonParam){ return httpPost(url, jsonParam, false); } /** * post请求 * @param url url地址 * @param jsonParam 参数 * @param noNeedResponse 不需要返回结果 * @return */ public static JSONObject httpPost(String url,JSONObject jsonParam, boolean noNeedResponse){ //post请求返回结果 DefaultHttpClient httpClient = new DefaultHttpClient(); JSONObject jsonResult = null; HttpPost method = new HttpPost(url); try { if (null != jsonParam) { //解决中文乱码问题 StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8"); entity.setContentEncoding("UTF-8"); entity.setContentType("application/json"); method.setEntity(entity); } HttpResponse result = httpClient.execute(method); url = URLDecoder.decode(url, "UTF-8"); /**请求发送成功,并得到响应**/ if (result.getStatusLine().getStatusCode() == 200) { String str = ""; try { /**读取服务器返回过来的json字符串数据**/ str = EntityUtils.toString(result.getEntity()); if (noNeedResponse) { return null; } /**把json字符串转换成json对象**/ jsonResult = JSONObject.fromObject(str); } catch (Exception e) { logger.error("post请求提交失败:" + url, e); } } } catch (IOException e) { logger.error("post请求提交失败:" + url, e); } return jsonResult; } }
测试类HttpRequestTest.java
package com.bijian.study; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.sf.json.JSONObject; import com.bijian.study.dto.UserDTO; /** * Http请求测试类 */ public class HttpRequestTest { private static Logger logger = LoggerFactory.getLogger(HttpRequestTest.class); public static void main(String[] args) { getRequestTest(); postRequestTest(); } private static void getRequestTest() { String url = "http://localhost:8080/SpringMVC/greet?name=lisi"; JSONObject jsonObject = HttpRequestUtil.httpGet(url); if(jsonObject != null) { String userName = (String) jsonObject.get("userName"); logger.info("http Get request process sucess"); logger.info("userName:" + userName); }else { logger.info("http Get request process fail"); } } private static void postRequestTest() { String url = "http://localhost:8080/SpringMVC/process"; UserDTO userDTO = new UserDTO(); userDTO.setName("zhangshang"); userDTO.setAge(25); JSONObject jsonParam = JSONObject.fromObject(userDTO); JSONObject responseJSONObject = HttpRequestUtil.httpPost(url, jsonParam); if(responseJSONObject != null && "SUCCESS".equals(responseJSONObject.get("status"))) { JSONObject userStr = (JSONObject) responseJSONObject.get("userDTO"); userDTO = (UserDTO) JSONObject.toBean(userStr, UserDTO.class); logger.info("http Post request process sucess"); logger.info("userDTO:" + userDTO); }else { logger.info("http Post request process fail"); } } }
完整的工程代码请下载附件《HttpClient.zip》。
四.补充说明
1.如果会出现异常:java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher,原因是少了JAR包,造成类找不到,除了要导入JSON网站上面下载的json-lib-2.1.jar包之外,还必须有其它几个依赖包:
commons-beanutils.jar commons-httpclient.jar commons-lang.jar ezmorph.jar morph-1.0.1.jar
2.@responseBody表示该方法的返回结果直接写入HTTP response body中。一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
3.关于HttpClient的其它方面的学习使用,可以参考:http://www.iteblog.com/archives/1379。附件《httpclientutil.zip》就是从这里下载的。
4.在实际使用当中,我们可能需要随机变换请求数据,甚至随机请求不同的服务器,可以参考如下方式。
public static void main(String arg[]) throws Exception { while (true) { String[] urlArray = {Constant.URL_1, Constant.URL_2}; int index = new Random().nextInt(2); String requestUrl = urlArray[index]; System.out.println(requestUrl); ... JSONObject jsonMsg = JSONObject.fromObject(obj); String ret = HttpRequestUtil.doPost(requestUrl, jsonMsg); System.out.println(ret); Thread.sleep(50); } }
Constant.java
public class Constant { public static final String URL_1 = PropertiesFileUtil.getPropValue("url1", "config"); public static final String URL_2 = PropertiesFileUtil.getPropValue("url2", "config"); }
import java.util.ResourceBundle; import org.apache.commons.lang.StringUtils; public final class PropertiesFileUtil { public static String getPropValue(String keyName, String propsName) { ResourceBundle resource = ResourceBundle.getBundle(propsName); String value = resource.getString(keyName); return value; } /** * 获取配置文件中keyName对应的value */ public static String getPropValue(String keyName, String propsName, String defaultValue) { ResourceBundle resource = ResourceBundle.getBundle(propsName); String value = resource.getString(keyName); if (StringUtils.isEmpty(value)) { value = defaultValue; } return value; } }
url1=http://localhost:8080/SpringMVC/greet?name=lisi url2=http://127.0.0.1:8080/SpringMVC/greet?name=zhangshan
相关推荐
### JAVA发送HttpClient请求及接收请求结果过程 #### 一、概述 在Java开发过程中,经常需要与外部系统进行HTTP通信,比如发送POST或GET请求来获取数据或提交数据。Apache HttpClient是一个强大的HTTP客户端库,提供...
在Java编程中,Apache HttpClient库是一个非常常用的工具,用于发送HTTP请求并接收响应。下面将详细解释如何使用HttpClient发送请求以及处理返回结果的过程。 首先,我们需要导入必要的依赖库,这通常包括Apache ...
本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...
在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求。这个压缩包可能包含了实现HTTP GET和POST请求所需的jar包以及示例代码,帮助开发者理解如何使用HttpClient进行网络通信。下面将详细介绍...
在Java编程环境中,HttpClient库是Apache HTTP Components项目的一部分,它为开发者提供了强大的HTTP客户端功能,可以用来发送HTTP请求并接收响应。在这个特定的场景中,我们利用HttpClient来从指定的URL下载文件到...
这个类可以接收参数,如URL、请求头和请求体,然后使用HttpClient发送POST请求。以下是一个简单的示例: ```java import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache....
### 使用HttpClient发送POST请求,并获取响应内容 #### 一、简介 在现代软件开发中,尤其是在Web应用领域,客户端与服务器之间的通信是非常重要的环节。Java作为一种广泛应用的编程语言,提供了多种方式来实现这一...
HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中发送和接收HTTP请求。这个库在处理网络通信,特别是与Web服务交互时非常有用。在本实例中,我们将深入探讨如何使用HttpClient来调用腾讯提供...
通过base64加密方式将用户名和密码进行封装,生成basic auth的认证信息,再将该信息塞进请求头里,最后通过认证进行get请求。
在Java编程中,HttpClient是一个非常常用的库,用于发送HTTP请求并接收响应。本文将深入讲解如何使用HttpClient实现POST请求,并通过具体的代码实例来演示整个过程。首先,我们来看一下使用HttpClient进行POST请求的...
在给定的代码片段中,主要展示了如何使用Java中的Apache HttpClient库发送一个包含XML数据的POST请求,并接收响应。下面是对关键部分的详细分析: 1. **导入必要的库**:代码首先导入了处理网络请求、输入输出流...
你可以使用它来发送数据(如POST请求中的表单数据)或接收响应体。 4. **HttpResponse**:表示HTTP响应,包含状态行、头部和实体。 5. **HttpClientContext**:提供了上下文信息,可以用来存储请求或连接级别的...
在Java编程领域,网络通信是不可或缺的一部分,而Apache HttpClient库为开发者提供了强大的HTTP客户端功能,使得我们可以方便地发送HTTP请求并接收响应。本篇将详细探讨`Java网络通信之HttpClient`的相关知识点,...
在Java编程中,发送HTTP请求并接收响应是常见的任务,特别是在网络编程和API交互中。JDK(Java Development Kit)自带的`java.net`包提供了基础的HTTP支持,包括发送GET和POST请求。这里我们将详细讲解如何使用Java...
HttpClient是Apache基金会开发的一个Java库,它允许程序员方便地向HTTP服务器发送请求并接收响应。在处理HTTPS(安全超文本传输协议)请求时,HttpClient扮演着至关重要的角色,尤其是在涉及敏感数据交换或需要验证...
在本文中,我们将深入探讨如何使用HttpClient发送POST请求,以及处理JSON参数和其他关键点。 1. 创建HttpClient实例: HttpClient的初始化通常涉及构建一个HttpClientBuilder对象,然后调用其build()方法来创建...
本项目实例提供了完整的源代码,帮助开发者理解并实践这两个主题。 首先,让我们深入理解HTTP请求。HTTP(超文本传输协议)是用于在Web上传输数据的标准协议。在Java中,可以通过多种方式实现HTTP请求,例如使用`...