首页 > 代码库 > 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先到这里,后续还会贴出来关于文件上传的是如何传入的。

不喜勿喷。