apache HttpClients实例,传入json对象。对应的springMvc通过HandlerMethodArgumentResolver解析两个对象绑定

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了,累死朕了,翻了好久的源码,其实就几行代码吗?啊啊啊,哈哈哈。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值