apache HttpClients实例,传入json对象。对应的springMvc通过HandlerMethodArgumentResolver解析两个对象绑定
SDK jar包部分,提供的客户端给别的项目方便调用。
package com.ihavecar.payment.sdk.http;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
/**
* http client
*
* @author liangrui
*
*/
public class AsyncHttp {
//protected static Logger logger = LoggerFactory.getLogger(AsyncHttp.class);
protected static CloseableHttpClient httpClient = HttpClients
.custom()
.setConnectionManager(new PoolingHttpClientConnectionManager())
.build();
// CloseableHttpClient DefaultHttpclient = HttpClients.createDefault();
}
package com.ihavecar.payment.sdk.http;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import net.sf.json.JSONObject;
import org.apache.http.Consts;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ihavecar.payment.sdk.bean.convert.PayOrder;
import com.ihavecar.payment.sdk.exception.HttpUriException;
/**
* <p>
* Http 服务
* </p>
* <p>
* 返回 JSONObject json格式,可以根据实结果,取数据. 如 :jsonObject.toString() 取json字符串、
* JSONObject.toBean(str, User.class);// 将建json对象转换为User对象、/n
* jsonObject.get("name") 取json里单个字段值
* </p>
*
* @date 2016/04/13
* @author ruilaing
*
*/
public class HttpService extends AsyncHttp {
protected Logger logger = LoggerFactory.getLogger(HttpService.class);
private HttpService() {
}
// private static final HttpService single = new HttpService();
private static HttpService httpServiceSingle = null;
// 静态工厂方法 懒汉式单例类.在第一次调用的时候实例化自己
public static HttpService getInstance() {
if (httpServiceSingle == null) {
httpServiceSingle = new HttpService();
}
return httpServiceSingle;
}
/**
* 内部处理url
*
* @param uri
* @return
* @throws HttpUriException
*/
private String disposeUrlAndParam(String url, String param)
throws HttpUriException {
if (url == null || "".equals(url)) {
throw new HttpUriException("uri 为空!");
}
if (!url.startsWith("http://")) {
throw new HttpUriException("http不合法!!!");
}
StringBuffer sb = new StringBuffer();
sb.append(url);
sb.append("?");
if (param == null || "".equals(param)) {
return sb.toString();
}
// 拼接url
sb.append(param);
return sb.toString();
}
/**
* 内部处理url
*
* @param uri
* @return
* @throws HttpUriException
*/
private String disposeUrlAndJson(String url, String param) {
if (url == null || "".equals(url)) {
throw new HttpUriException("uri 为空!");
}
if (!url.startsWith("http://")) {
throw new HttpUriException("http不合法!!!");
}
if (!param.startsWith("{") || !param.endsWith("}")) {
throw new HttpUriException("参数不是json格式数据!!!" + param);
}
return url;
}
/**
* 内部处理url
*
* @param uri
* @return
* @throws HttpUriException
*/
private String disposeUrlAndJsonObject(String url, Object param) {
if (url == null || "".equals(url)) {
throw new HttpUriException("uri 为空!");
}
if (!url.startsWith("http://")) {
throw new HttpUriException("http不合法!!!");
}
if (param==null|| "".equals(param)) {
throw new HttpUriException("参数为空");
}
return url;
}
/**
* get 请求
*
* @param url
* http://localhost:8080?
* @param param
* user=admin&password=123456
* @return JSONObject json数据
* @throws HttpUriException
*/
public JSONObject get(String url, String param) {
String httpUrl = disposeUrlAndParam(url, param);
logger.debug("get req url>>>{}", httpUrl);
HttpGet get = new HttpGet(httpUrl);
String rsult = null;
try {
HttpResponse httpResponse = httpClient.execute(get);
rsult = EntityUtils.toString(httpResponse.getEntity());
} catch (ParseException e) {
rsult = "";
e.printStackTrace();
} catch (IOException e) {
rsult = "";
e.printStackTrace();
}
if ("".equals(rsult)) {
return null;
}
return JSONObject.fromObject(rsult);
}
/**
* post 请求
*
* @param url
* http://localhost:8080?
* @param param
* user=admin&password=123456
* @return JSONObject json数据
* @throws HttpUriException
*/
public JSONObject postReq(String url, String param) throws HttpUriException {
String httpUrl = disposeUrlAndParam(url, param);
logger.debug("post req url>>>\n{}{}", httpUrl);
HttpPost post = new HttpPost(httpUrl);
StringEntity reqEntity;
String rsult = "";
try {
reqEntity = new StringEntity(param, ContentType.create(
"application/x-www-form-urlencoded", Consts.UTF_8));
// reqEntity.setContentType("application/x-www-form-urlencoded");
post.setEntity(reqEntity);
HttpResponse httpResponse = httpClient.execute(post);
rsult = EntityUtils.toString(httpResponse.getEntity());
} catch (UnsupportedEncodingException e) {
rsult = "";
e.printStackTrace();
} catch (ClientProtocolException e) {
rsult = "";
e.printStackTrace();
} catch (IOException e) {
rsult = "";
e.printStackTrace();
}
if ("".equals(rsult)) {
return null;
}
return JSONObject.fromObject(rsult);
}
/**
* json格式请求
*
* @param url
* @param param json 字符串
* @return
* @throws HttpUriException
*/
public JSONObject postReqtoParamJSONString(String url, String param)
throws HttpUriException {
String httpUri = disposeUrlAndJson(url, param);
logger.debug("post req httpUri>>>\n{}{}", httpUri);
HttpPost post = new HttpPost(httpUri);
String rsult = "";
try {
post.addHeader("Content-type", "application/json; charset=utf-8");
post.setHeader("Accept", "application/json");
post.setEntity(new StringEntity(param, Charset.forName("UTF-8")));
HttpResponse httpResponse = httpClient.execute(post);
int statusCode = httpResponse.getStatusLine().getStatusCode(); //返回状态码 ,用来进行识别或者判断访问结果
if(statusCode == 200){
rsult = EntityUtils.toString(httpResponse.getEntity());
}else{
logger.error(EntityUtils.toString(httpResponse.getEntity()));
rsult = "";
}
} catch (UnsupportedEncodingException e) {
rsult = "";
e.printStackTrace();
} catch (ClientProtocolException e) {
rsult = "";
e.printStackTrace();
} catch (IOException e) {
rsult = "";
e.printStackTrace();
}
if ("".equals(rsult)) {
return null;
}
return JSONObject.fromObject(rsult);
}
/**
* json格式请求
*
* @param url
* @param param json 对象
* @return
* @throws HttpUriException
*/
public JSONObject postReqtoParamJSONObject(String url, Object param)
throws HttpUriException {
String httpUri = disposeUrlAndJsonObject(url, param);
logger.debug("post req httpUri>>>\n{}{}", httpUri);
HttpPost post = new HttpPost(httpUri);
String rsult = "";
try {
String josnParm = JSONObject.fromObject(param).toString();
post.addHeader("Content-type", "application/json; charset=utf-8");
post.setHeader("Accept", "application/json");
post.setEntity(new StringEntity(josnParm, Charset.forName("UTF-8")));
HttpResponse httpResponse = httpClient.execute(post);
rsult = EntityUtils.toString(httpResponse.getEntity());
} catch (UnsupportedEncodingException e) {
rsult = "";
e.printStackTrace();
} catch (ClientProtocolException e) {
rsult = "";
e.printStackTrace();
} catch (IOException e) {
rsult = "";
e.printStackTrace();
}
if ("".equals(rsult)) {
return null;
}
return JSONObject.fromObject(rsult);
}
public static void main(String[] args) {
PayOrder payOrder = new PayOrder();
payOrder.setOrderStatus(5);
payOrder.setAsynReturnUrl("http://baidu");
payOrder.setOrderDesc("aaa");
JSONObject jsonObject = JSONObject.fromObject(payOrder);
System.out.println(jsonObject.get("email"));
String str = jsonObject.toString();
System.out.println(str);
JSONObject obj = JSONObject.fromObject(str);// 将json字符串转换为json对象
// 将json对象转换为java对象
PayOrder jb = (PayOrder) JSONObject.toBean(obj, PayOrder.class);// 将建json对象转换为User对象
System.out.println(jb);
// BalanceDto alanceDto = (BalanceDto) JSONObject.stringToValue(msgObj);
}
}
一个例子
package com.ihavecar.payment.sdk.api.impl;
import net.sf.json.JSONObject;
import com.ihavecar.payment.sdk.annotation.SdkReqUri;
import com.ihavecar.payment.sdk.api.IPayOrderSDKService;
import com.ihavecar.payment.sdk.api.common.SDKAbstract;
import com.ihavecar.payment.sdk.bean.common.ResultBean;
import com.ihavecar.payment.sdk.bean.convert.PayOrder;
import com.ihavecar.payment.sdk.exception.HttpUriException;
import com.ihavecar.payment.sdk.exception.common.ErrorCode;
import com.ihavecar.payment.sdk.exception.common.HttpNoSuccessException;
import com.ihavecar.payment.sdk.http.HttpService;
import com.ihavecar.payment.sdk.utils.GetAnnotationUri;
import com.ihavecar.payment.sdk.utils.PMessageGen;
import com.ihavecar.payment.sdk.utils.ResultResolve;
import com.ihavecar.payment.sdk.vo.PMessage;
import com.ihavecar.payment.sdk.vo.PayOrderVo;
/**
* 订单SDK服务
*
* @author ruilaing
*
*/
public class PayOrderSDKService extends SDKAbstract implements
IPayOrderSDKService {
/**
* 由服务端 构造
*
* @param uri
*/
public PayOrderSDKService(String uri) {
super(uri);
}
/**
* 根据订单号查询信息
*
* @param payOrderNo
* @return
* @return
* @throws Exception
*/
@SdkReqUri(uri = "v1/order/get")
public PayOrder getOrder(String payOrderNo) throws Exception {
JSONObject jsob = HttpService.getInstance().get(getUrl(),
"payOrderNo=" + payOrderNo);
// 解析 数据 并返回
PayOrder payOrder = ResultResolve.<PayOrder> resolve(jsob,
PayOrder.class);
return payOrder;
}
/**
* 添加订单
*
* @param payOrderNo
* @return
*/
@SdkReqUri(uri = "v1/order/add")
public PayOrder addOrder(PayOrderVo payOrderVo) throws Exception {
JSONObject jsonb = JSONObject.fromObject(payOrderVo);
PMessage message = PMessageGen.createPmessage(payOrderVo);
jsonb.put("PMessage", message);
//
JSONObject jsob = HttpService.getInstance().postReqtoParamJSONString(
getUrl(), jsonb.toString());
// 解析 数据 并返回
PayOrder payOrder = ResultResolve.<PayOrder> resolve(jsob,
PayOrder.class);
return payOrder;
}
}
服务端:sprinv mvc 解析
<mvc:annotation-driven>
<mvc:argument-resolvers>
<!-- <bean class="com.ihavecar.payment.utils.converter.JSONConverter"> -->
<!-- <constructor-arg> -->
<!-- <list> -->
<!-- <bean -->
<!-- class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> -->
<!-- </list> -->
<!-- </constructor-arg> -->
<!-- </bean> -->
<bean class="com.ihavecar.payment.utils.converter.PMssageConverter"/>
<bean class="com.ihavecar.payment.utils.converter.JsonVoConverter"/>
</mvc:argument-resolvers>
<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.ihavecar.payment.utils.converter.ResponseNullUtil"></bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
package com.ihavecar.payment.utils.converter;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.reflect.TypeToken;
import com.ihavecar.payment.sdk.vo.PMessage;
public class PMssageConverter implements HandlerMethodArgumentResolver {
// PMessage
static Logger logger = LoggerFactory.getLogger(PMssageConverter.class);
final TypeToken<PMessage> type = new TypeToken<PMessage>() {
private static final long serialVersionUID = -5448869194131285385L;
};
private ObjectMapper objectMapper = new ObjectMapper().configure(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
@Override
public boolean supportsParameter(MethodParameter parameter) {
return type.getRawType().isAssignableFrom(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
mavContainer.setRequestHandled(true);
final HttpServletRequest servletRequest = webRequest
.getNativeRequest(HttpServletRequest.class);
HttpInputMessage inputMessage = new ServletServerHttpRequest(
servletRequest);
JsonNode node = this.objectMapper.readTree(inputMessage.getBody());
// System.out.println(node.toString());
JsonNode pmssage = node.get("PMessage");
PMessage pMessage = objectMapper.readValue(pmssage.toString(),
PMessage.class);
JSONObject jsob = new JSONObject().fromObject(node.toString());
jsob.remove("PMessage");
String strBody = new JSONObject().fromObject(jsob).toString();
pMessage.setBody(strBody);
webRequest.setAttribute("PMessage", pMessage,
RequestAttributes.SCOPE_REQUEST);
return pMessage;
}
}
package com.ihavecar.payment.utils.converter;
import java.lang.annotation.Annotation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import com.ihavecar.payment.annotation.ArgumentVo;
import com.ihavecar.payment.sdk.vo.PMessage;
public class JsonVoConverter implements HandlerMethodArgumentResolver {
// PMessage
static Logger logger = LoggerFactory.getLogger(JsonVoConverter.class);
// final TypeToken<BaseJsonVo> type = new TypeToken<BaseJsonVo>() {
// private static final long serialVersionUID = -5448869194131285385L;
// };
@Override
public boolean supportsParameter(MethodParameter parameter) {
// return
// type.getRawType().isAssignableFrom(parameter.getParameterType());
Class<?> klass = parameter.getParameterType();
// if (klass.isAssignableFrom(ArgumentVo.class) ) {
Annotation[] as = parameter.getParameterAnnotations();
for (Annotation a : as) {
if (a.annotationType() == ArgumentVo.class) {
return true;
}
}
// }
return false;
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
mavContainer.setRequestHandled(true);
// final HttpServletRequest servletRequest = webRequest
// .getNativeRequest(HttpServletRequest.class);
// HttpInputMessage inputMessage = new
// ServletServerHttpRequest(servletRequest);
//
// System.out.println(type.getRawType());
// JsonNode node= this.objectMapper.readTree(inputMessage.getBody());
// JsonNode jstr=node.get("body");
// System.out.println(jstr.toString());
// Object obj= objectMapper.readValue(node.toString(),
// type.getRawType());
// System.out.println(obj);
// webRequest.setAttribute("PMessage", obj,
// RequestAttributes.SCOPE_REQUEST);
PMessage pMessage = (PMessage) webRequest.getAttribute("PMessage",
RequestAttributes.SCOPE_REQUEST);
Object resultObj = pMessage.getBodyObj(parameter.getParameterType());
return resultObj;
}
}
package com.ihavecar.payment.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ihavecar.payment.annotation.ArgumentVo;
import com.ihavecar.payment.bean.ResultBean;
import com.ihavecar.payment.common.BaseController;
import com.ihavecar.payment.entity.PayOrder;
import com.ihavecar.payment.sdk.exception.common.ErrorCode;
import com.ihavecar.payment.sdk.vo.PMessage;
import com.ihavecar.payment.sdk.vo.PayOrderVo;
import com.ihavecar.payment.service.IPayOrderService;
/**
* 支付订单
*
* @author ruiliang
*
*/
@Controller
@RequestMapping("/v1/order")
public class PayOrderController extends BaseController {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private IPayOrderService userService;
@RequestMapping(value = "get", method = RequestMethod.GET)
@ResponseBody
public ResultBean get(
HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "payOrderNo", required = false) Integer payOrderNo) {
ResultBean rb = new ResultBean();
try {
PayOrder payOrder = userService.get(1);
rb.setData(payOrder);
} catch (Exception e) {
e.printStackTrace();
rb = new ResultBean(false, ErrorCode.SYS_ERROR, "异统异常");
}
return rb;
}
@RequestMapping(value = "add", method = RequestMethod.POST)
@ResponseBody
public ResultBean add(HttpServletRequest request,
HttpServletResponse response, PMessage message,
@ArgumentVo PayOrderVo payOrderVo) {
ResultBean rb = new ResultBean();
//Object o=(PMessage)request.getAttribute("PMessage");
try {
int count = userService.addPayOrder(payOrderVo);
rb.setData(payOrderVo);
} catch (Exception e) {
e.printStackTrace();
rb = new ResultBean(false, ErrorCode.SYS_ERROR, "异统异常");
}
return rb;
}
}
测试的例子
package com.ihavecar.payment.sdk;
import java.math.BigDecimal;
import org.junit.Test;
import com.ihavecar.payment.BaseSDKTest;
import com.ihavecar.payment.sdk.api.IPayOrderSDKService;
import com.ihavecar.payment.sdk.api.impl.PayOrderSDKService;
import com.ihavecar.payment.sdk.bean.convert.PayOrder;
import com.ihavecar.payment.sdk.vo.PayOrderVo;
/**
* SDK 订单服务测试
* @author ruiliang
*
*/
public class PayOrderSDKTest extends BaseSDKTest {
/**
* 通过id获娶订单 测试
* @throws Exception
*/
@Test
public void getPayOrder() throws Exception {
com.ihavecar.payment.sdk.bean.convert.PayOrder obj = new PayOrderSDKService(
"http://localhost:8080/").getOrder("1");
// System.out.println(obj.toString());
printJson(obj);
}
/**
* 添加订单测试
* @throws Exception
*/
@Test
public void add() throws Exception {
PayOrderVo payOrderNo = new PayOrderVo();
payOrderNo.setAsynReturnUrl("http://baidu.com");
payOrderNo.setOrderActualAmount(new BigDecimal(50));
payOrderNo.setOrderDesc("哈哈");
payOrderNo.setOrderIp("10.0.01.2");
payOrderNo.setOrderTitle("标题订单");
payOrderNo.setOrderTotalAmount(new BigDecimal(888));
IPayOrderSDKService service = new PayOrderSDKService(
"http://localhost:8080/");
PayOrder obj = service.addOrder(payOrderNo);
printJson(obj);
}
}
终于OK了,累死朕了,翻了好久的源码,其实就几行代码吗?啊啊啊,哈哈哈。。。。