公司内部一般都是用自研的rpc pigeon
  但是涉及到第三方合作都会使用http请求,如果你尝试使用httpclient你又会被众多的版本和不同的api所困扰,经常忘记设置线程数,忘记设置超时时间等。
  就算你搞定了httpclient,你会发现与第三方定义的请求方式和描述难于维护,交于第二个维护的时候代码不容易阅读,于是基于javaAPI来请求http请求的想法萌生,就有了如下的微框架。
  本框架有如下优势:
         - 基于httpclient, 仅暴露常用的配置, 填掉了常见的坑
- 接口设计参考jsoup, 简易的语法让人耳目一新
- 支持所有的请求方法:GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,TRACE
- 出参入参对json极为友好, 自动解析返回对象to pojo
- 可以像rpc一样基于java api发送http请求, 代码更加规范稳定, 易于管理
- 当返回值为HttpResult时, 调用失败也不会抛出异常.
- 支持返回值取json path, 例如:msg.user.id/msg.user[1].id 参考测试包下 ResultJsonPathTest
- 支持设计重试次数, 建议get请求都有重试机制, 参考测试包下 RetryTest
- 支持上传各种类型的文件, 支持File/InputStream/byte[]/base64上传, 参考测试包下 UploadFileTest
- 支持@PathVariable 如 http://.com/{key}/info -> http://.com/xiaojie.chen/info, 参考测试包下 SimpleTest
- 支持自定义httpclient, 参考 CustomHttpClientTest
- 自定义请求拦截器可以作于自定义授权
- 日志清晰,排查case十分方便
- 支持自定义植入监控,如大众点评的cat
- 开发者正处壮年,有问题立即反馈~~哈哈哈
   
  具体的源码和使用方式请访问:
  https://github.com/chenxiaojie/http-invoker
   
  使用入门:
  最简单的实例,先定义个httpapi
  public interface SimpleHttpApi {      //get     @RequestMapping(value = "/simple/{loginId}", method = HttpMethod.GET)     Response<UserLoginModel> getByLoginId(@PathVariable("loginId") int loginId,                                           @RequestParam(value = "employeeId") String employeeId,                                           @RequestParam(value = "employeeName") String employeeName,                                           @RequestParam(value = "ad") String ad);       //post     @RequestMapping(value = "/{path}", method = HttpMethod.POST)     HttpResult<Response<UserLoginModel>> addUser5(@RequestBody UserLoginModel userLoginModel,                                                   @PathVariable("path") String path,                                                   @RequestParam(value = "employeeId") String employeeId,                                                   @RequestParam(value = "employeeId") String employeeId2,                                                   @RequestParam(value = "employeeId") String employeeId3,                                                   @RequestParam(value = "employeeName") String employeeName,                                                   @RequestParam(value = "ad") String ad);               //upload     @RequestMapping(value = "/{path}", method = HttpMethod.POST)     HttpResult<Response<String>> upload(@RequestFile("a1.png") InputStream in,                                         @RequestFile("a2.png") File file,                                         @RequestFile("a3.png") byte[] fileBytes,                                         @RequestFile("a4.png") String base64,                                         @PathVariable("path") String path,                                         @RequestParam(value = "employeeId") String employeeId,                                         @RequestParam(value = "employeeId") String employeeId2,                                         @RequestParam(value = "employeeId") String employeeId3,                                         @RequestParam(value = "employeeName") String employeeName,                                         @RequestParam(value = "ad") String ad);          //retry     @RequestMapping(value = "/simple/{loginId}", method = HttpMethod.GET, retryTimes = 1)     HttpResult<Response<UserLoginModel>> getByLoginId(@PathVariable("loginId") String loginId,                                                           @RequestParam(value = "employeeId") String employeeId,                                                           @RequestParam(value = "employeeName") String employeeName,                                                           @RequestParam(value = "ad") String ad);               //jsonPath     @RequestMapping(value = "/simple/list", method = HttpMethod.GET, retryTimes = 1, resultJsonPath = "data[1].employeeName")     String queryUsers();  }
   
  通过java方式调用
  HttpInvocationHandler httpInvocationHandler = new HttpInvocationHandler(); httpInvocationHandler.setRequestUrlPrefix(Consts.URL);  SimpleHttpApi simpleHttpApi = (SimpleHttpApi) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),         new Class[]{SimpleHttpApi.class},         httpInvocationHandler);  UserLoginModel userLoginModel = new UserLoginModel(); userLoginModel.setLoginId(1); userLoginModel.setEmployeeId("0016004"); userLoginModel.setEmployeeName("陈孝杰"); userLoginModel.setAd("xiaojie.chen");  Response<UserLoginModel> response = simpleHttpApi.addUser(userLoginModel);  System.out.println(response.getData());
   
  通过spring方式调用
  <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xmlns="http://www.springframework.org/schema/beans"        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">      <bean id="httpParent" class="com.chenxiaojie.http.invoker.spring.HttpProxyFactoryBean" abstract="true" init-method="init">         <property name="invocationHandler">             <bean class="com.chenxiaojie.http.invoker.proxy.HttpInvocationHandler">                 <property name="requestUrlPrefix" value="http://localhost:8081/httpinvoker"></property>             </bean>         </property>     </bean>      <!-- 只需配置下方代码即可 -->     <bean id="simpleHttpApi" parent="httpParent">         <property name="proxyInterfaces" value="com.chenxiaojie.http.invoker.test.http.api.SimpleHttpApi"/>     </bean> </beans>