Spring 实现远程访问详解——HttpClient
来源:互联网 发布:linux tomcat假死监控 编辑:程序博客网 时间:2024/05/18 22:53
上两章我们分别利用Spring rmi和httpinvoker实现的远程访问功能,具体见《Spring 实现远程访问详解——httpinvoker》和《Spring 实现远程访问详解——rmi》和《Spring 实现远程访问详解——webservice》
本章将通过apache httpclient实现远程访问。说得简单就是直接通过spring requestmapping即请求映射url访问远程服务。1. 远程访问流程
1) 服务器在控制器定义远程访问请求映射路径
2) 客户端通过apache httpclient的 httppost方式访问远程服务
2. Httpclient方式具体实现
1) maven引入依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency></span>
2) 服务器在控制器定义远程访问请求映射路径
@RequestMapping(value="/httpClientTest") @ResponseBody public BaseMapVo httpClientTest(String name, String password){ BaseMapVo vo = new BaseMapVo(); List<User> users = userService.getUserByAcount(name, password); vo.addData("user", users); vo.setRslt("success"); return vo;
3) 客户端定义httpClient
package com.lm.core.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; importjava.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; importorg.apache.http.client.ClientProtocolException; importorg.apache.http.client.entity.UrlEncodedFormEntity; importorg.apache.http.client.methods.CloseableHttpResponse; importorg.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; importorg.apache.http.impl.client.HttpClients; importorg.apache.http.message.BasicNameValuePair; public class HttpClientUtil implementsRunnable { /** * 不能在主线程中访问网络所以这里另新建了一个实现了Runnable接口的Http访问类 */ private String name; private String password; private String path; public HttpClientUtil(String name, String password,String path) { // 初始化用户名和密码 this.name = name; this.password = password; this.path = path; } @Override public void run() { // 设置访问的Web站点 // 设置Http请求参数 Map<String, String> params = new HashMap<String, String>(); params.put("name", name); params.put("password", password); String result = sendHttpClientPost(path, params, "utf-8"); // 把返回的接口输出 System.out.println(result); } /** * 发送Http请求到Web站点 * * @param path * Web站点请求地址 * @param map * Http请求参数 * @param encode * 编码格式 * @return Web站点响应的字符串 */ private String sendHttpClientPost(String path, Map<String, String>map, String encode) { List<NameValuePair> list = new ArrayList<NameValuePair>(); if (map != null && !map.isEmpty()) { for (Map.Entry<String, String> entry : map.entrySet()) { // 解析Map传递的参数,使用一个键值对对象BasicNameValuePair保存。 list.add(newBasicNameValuePair(entry.getKey(), entry .getValue())); } } HttpPost httpPost = null; CloseableHttpClient client = null; InputStream inputStream = null; try { // 实现将请求的参数封装封装到HttpEntity中。 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode); // 使用HttpPost请求方式 httpPost = new HttpPost(path); // 设置请求参数到Form中。 httpPost.setEntity(entity); // 实例化一个默认的Http客户端 client = HttpClients.createDefault(); // HttpClient client = newDefaultHttpClient(); // 执行请求,并获得响应数据 CloseableHttpResponse httpResponse = client.execute(httpPost); // 判断是否请求成功,为200时表示成功,其他均问有问题。 System.err.println("status:"+httpResponse.getStatusLine().getStatusCode()); try{ if(httpResponse.getStatusLine().getStatusCode() == 200) { // 通过HttpEntity获得响应流 inputStream =httpResponse.getEntity().getContent(); returnchangeInputStream(inputStream, encode); } }finally{ if( null != httpResponse){ httpResponse.close(); } if(null != inputStream){ inputStream.close(); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(null != client){ try { client.close(); }catch (IOException e) { //TODO Auto-generated catch block e.printStackTrace(); } } } return ""; } /** * 把Web站点返回的响应流转换为字符串格式 * * @param inputStream * 响应流 * @param encode * 编码格式 * @return 转换后的字符串 */ private String changeInputStream(InputStream inputStream, String encode){ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; String result = ""; if (inputStream != null) { try { while ((len =inputStream.read(data)) != -1) { outputStream.write(data, 0,len); } result = newString(outputStream.toByteArray(), encode); } catch (IOException e) { e.printStackTrace(); }finally{ if(outputStream != null){ try { outputStream.close(); }catch (IOException e) { //TODO Auto-generated catch block e.printStackTrace(); } } } } return result; } }
4) 客户端访问远程服务
@RequestMapping(value = "/httpClientTest")@ResponseBody public BaseMapVo httpClientTest(String name, String password) { BaseMapVo vo = new BaseMapVo(); long startDate = Calendar.getInstance().getTimeInMillis(); System.out.println("httpInvoker客户端开始调用" + startDate); String path="http://127.0.0.1:8080/spring_remote_server/user/httpClientTest"; HttpClientUtil httpClientUtil = new HttpClientUtil(name, password, path); new Thread(httpClientUtil).start(); // UserHttpService rmi = (UserHttpService)ApplicationContextUtil.getInstance().getBean("httpInvokerProxy"); // rmi.getUserByAcount("张三", ":张三的密码"); System.out.println("httpInvoker客户端调用结束" + (Calendar.getInstance().getTimeInMillis()-startDate)); vo.setRslt("sucess"); return vo; }
代码下载:http://download.csdn.net/detail/a123demi/9495928
博文转自:http://blog.csdn.net/a123demi/article/details/51206079
阅读全文
0 0
- Spring 实现远程访问详解——httpclient
- Spring 实现远程访问详解——HttpClient
- Spring 实现远程访问详解——rmi
- Spring 实现远程访问详解——httpinvoker
- Spring 实现远程访问详解——webservice
- Spring 实现远程访问详解——jms和activemq
- HttpClient实现网络访问详解
- Java之——Spring与RMI集成实现远程访问(插曲)
- Spring与RMI集成实现远程访问
- Spring基于JMS实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- Spring与RMI集成实现远程访问
- CPU 频率
- UVA 10791 Minimum Sum LCM(质因数分解)
- 成绩排名
- 素数环
- 写专利文档的流程
- Spring 实现远程访问详解——HttpClient
- 20171106工作记录_AVL培训
- CDH5的卸载
- linux-终止进程ps kill、killall
- 温度传感器DS18B20使用
- 4、各种调度算法及其评价
- 【二、Leetcode哈希表专题】
- Linus 安装nodejs npm
- WebService学习总结(四)——调用第三方提供的webService服务