首页 > 代码库 > httpclient用法。
httpclient用法。
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。。。
httpclient可以帮助我们模仿http请求,我这里是在测试并发问题用到的,也是第一次接触httpclient觉得非常不错,也挺好用的容易上手。故在这里做一笔记,避免自己遗忘。下面就直接贴代码。。
我这里有个小例子:主要是提供给其他公司或者其他系统回调本系统的一个接口(http协议)。。。对于提供的http接口我们需要注意什么呢?最重要的一点就是:安全性不是所有人发过来的请求都是可以访问的,我这里是做了个简单的令牌验证来进行过滤。
先来说下这个简单的令牌验证原理吧,觉得还是有点用的。如有帮助大家也可以进行参考。
1:在http请求头里面加入参数如:httpPost.addHeader("auth_token", "silencily");后台是对这个参数进行一个MD5一个加密:(然后加密后的字符在加上固定字符,再进行一次加密保存数据库)。访问接口的时候进行一次验证。验证前台传入的跟数据库的是否一致,如果是一致的则进行接口的访问,如果不一致则返回请先注册接口。因为安全要求不是很高,所以令牌就先到这里。
2:httpclient模拟接口需要注意的问题,首先你url请求先绕过登陆验证。有些系统拦截.do请求进行登陆验证,有些是.action进行拦截,我这个系统就是只拦截.do请求,那么我不用LoginCtrl.do我直接使用LoginCtrl就行了(也算个小bug吧。)
下面我就直接贴出代码:只要是用StringEntity对象传参,前台传入json格式,后台SpringMVC直接把json转换成参数对应的实体对象。
(1)首先是前台httpclient请求。
@Test public void testSendMessages() { String result = null; HttpClient httpClient = new DefaultHttpClient(); String url = "http://localhost:8080/minxinloan/service/delivery/messages";//messages.do因为有登录验证拦截.do请求,所以我这里就写messages绕过登录验证,不了就要提示请先登录。 System.out.println("Invoking sms interface:" + url); HttpPost httpPost = new HttpPost(url); String json = "{ " + " \"template_code\": \"T_ANON\", " + " \"template\": \"祝你发财!\", " + " \"phones\": [ " + " \"13200233383\", " + " \"13683324944\"" + " ], " + " \"argument\": [ ]" + "}"; JSONObject jsonObject = JSONObject.fromObject(json); System.out.println(jsonObject.toString()); try { httpPost.addHeader("auth_token", "silencily"); httpPost.addHeader("consumer", "1/person2/2/dept2/192.86.2.3"); StringEntity stringEntity = new StringEntity(jsonObject.toString(), "UTF-8"); stringEntity.setContentType("application/json"); httpPost.setEntity(stringEntity); HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity); } catch (Exception e) { e.printStackTrace(); } finally { httpClient.getConnectionManager().shutdown(); } System.out.println("Result of Invoking sms interface:" + result); }
下面就是对前台传入的json字符串接受了(直接封装成一个对象。。)但前提是对象里面的属性需要跟json里面的如name:张三。对应起来。然后对象里面还可以定义其他对象,但是你json里面也需要这样对应。下面是代码
我这里MultiMessages对象就是对和json里面对应的。下面也会贴出来。
@ResponseBody @RequestMapping(value = "multi_messages", method = RequestMethod.POST) public MessageResult sendMultiMessages(@RequestHeader("auth_token") String authToken, @RequestHeader String consumer, @RequestBody MultiMessages multiMessages) { log.info("Handling multi_messages request."); MessageResult messageResult = new MessageResult(); if (!authTokenValidator.validate(authToken)) { log.info("auth token is invalid."); messageResult.setStatus(MessageResult.STATUS_FAIL); messageResult.setCount("0"); messageResult.setError("Invalid auth token."); } else { log.info("auth token is valid."); log.info("header ‘consumer‘ is :" + consumer); try { messageResult = openAPIService.sendMultiMessages(consumer, multiMessages); log.info("handle count:" + messageResult.getCount()); } catch (OpenAPIException e) { log.error("handle multiMessages failed.", e); messageResult = e.generateResult(); } } return messageResult; }
MultiMessages对象
/* * CopyRright (c) 2013, Minxin and/or its affiliates. All rights reserved. */package com.minxinloan.sms.handle.api.web.vo;import java.util.List;/** * 批量不同短信对象,对应json数据 * * @author gejb * @since 14-7-24 */public class MultiMessages { private String template_code; private String template; private List<MultiMessagesData> data; public String getTemplate_code() { return template_code; } public void setTemplate_code(String template_code) { this.template_code = template_code; } public String getTemplate() { return template; } public void setTemplate(String template) { this.template = template; } public List<MultiMessagesData> getData() { return data; } public void setData(List<MultiMessagesData> data) { this.data =http://www.mamicode.com/ data; }}
到这里,json参数就传入过来了。
目前httpclient先到这里,后续还会贴出来关于文件上传的是如何传入的。
不喜勿喷。