Java实现Http客户端服务端间通信

访问Http Post请求的代码示例,项目为spring boot框架,省略不重要的部分。

1、Post服务端代码

样例1:

    @RequestMapping(value ="/testDemo1",method = RequestMethod.POST,produces={"application/xml"})
    public @ResponseBody String testDemo1(@RequestBody String body) throws IOException 
    {
    	logger.info(body);    //通过@RequestBody 获取Post 的消息体内容,另外可自行了解@RequestParam、@RequestAttribute
    	return abc;
    }
样例2:
    @RequestMapping(value ="/testDemo",method = RequestMethod.POST,produces={"application/xml"})
    public @ResponseBody String flashSingalInterface(HttpServletRequest request, HttpServletResponse response) throws IOException 
    {
    	// 读取请求内容 ----直接从request中获取
        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));  
        String line = null;  
        StringBuilder sb = new StringBuilder();  
        while((line = br.readLine())!=null){  
            sb.append(line);  
        }  
      
        // 将资料解码  
        String reqBody = sb.toString();  
        String result = URLDecoder.decode(reqBody, "utf-8");  //utf-8
        
        logger.info(result);
        
    	Map<String, String> map = new HashMap<String, String>();
    	map.put("resultCode", "200");
    	map.put("resultDesc", "nice try");
    	
    	logger.info(JacksonUtil.bean2Json(map));
    	return JacksonUtil.bean2Json(map);
    }

2、客户端代码:(网上很多样例可参考,代码大同小异,依赖的jar包可能略有区别,注意下就行)

样例1:使用httpclient-4.5.2.jar 、httpcore-4.4.1.jar里的方法

import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

入参为 url地址、json字符串、编码方式。

    private static String sendPost(String url, String jsonParams, String encoding) throws ClientProtocolException, IOException
    {
	int statusCode = 0;
	String body = "";
	String resultCode = "";

	// 设置协议http和https对应的处理socket链接工厂的对象
	Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
			.register("http", PlainConnectionSocketFactory.INSTANCE).build();

	PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
	HttpClients.custom().setConnectionManager(connManager);

	// 创建自定义的httpclient对象
	CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
	// 创建post方式请求对象
	HttpPost httpPost = new HttpPost(url);
	
	StringEntity uefEntity = new StringEntity(jsonParams, encoding);
	uefEntity.setContentType("application/json");

	// 设置参数到请求对象中
	httpPost.setEntity(uefEntity);

	// 执行请求操作,并拿到结果(同步阻塞)
	CloseableHttpResponse response = client.execute(httpPost);

	statusCode = response.getStatusLine().getStatusCode();

	if (200 != statusCode) 
	{
		resultCode = "-1";
		return resultCode;
	}

	// 获取结果实体
	HttpEntity entity = response.getEntity();
	if (entity != null)
	{
		// 按指定编码转换结果实体为String类型
		body = EntityUtils.toString(entity, encoding);
		resultCode = getJson(body);
	}
	EntityUtils.consume(entity);

	// 释放链接
	response.close();
	return resultCode;
}

    //解析json串,获取resultCode值
    private static String getJson(String body)
    {
	JSONObject obj = JSONObject.fromObject(body);	
	String resultCode = obj.getString("resultCode");
	return resultCode;
    }

PS:使用Jackson,注意依赖包要导全了,参考:https://blog.csdn.net/zengdeqing2012/article/details/52053832

主函数:

    public static void main(String[] args)
    {
    	String postUrl = "http://localhost:8080/testDemo";
    	String reqJson = "{'name':'zhnagsan','age':'你好'}";
    	try 
    	{
	    sendPost(postUrl, reqJson, "UTF-8");
	}
    	catch (IOException e) 
    	{
	    e.printStackTrace();
	}
    }


样例2:使用com.springsource.org.apache.commons.httpclient-3.1.0.3510.jar 里的方法

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;

入参为url、Map类型的消息体(代码里进行json封装)

private static void send2(String url, Map<String, String> contentPara) throws IOException
{
	HttpClient client = new HttpClient();
	PostMethod httpPost = new PostMethod(url);	
	httpPost.setRequestHeader("Content-type", "text/xml; charset=utf-8");
//	httpPost.setRequestHeader("Content-Length", String.valueOf(reqHead.length()));
	
	BufferedReader br = null;	
	String content = JacksonUtil.bean2Json(contentPara);
	
	httpPost.setRequestEntity(new StringRequestEntity(content, "text/xml", "utf-8"));
	int returnCode = client.executeMethod(httpPost);
	// 请求成功
	if (returnCode == 200)
	{
		br = new BufferedReader(new InputStreamReader(httpPost.getResponseBodyAsStream(), "utf-8"));
		StringBuffer stb = new StringBuffer();
		String str = null;
		// 拼接json字符串 后续处理
		while ((str = br.readLine()) != null)
		{
		    stb.append(str);
		}
		System.out.println(stb);
	} 
	br.close();	
	return;
}

主函数:    

public static void main(String[] args){
    	String postUrl = "xxx";
    	Map<String, String> map = new HashMap<String, String>();
    	map.put("name", "zhangsan");
    	map.put("age", "你好");
    	try{
    	    send2(postUrl, map);
	} catch (IOException e) {
            e.printStackTrace();
	}
}

3、自定义Jackson 工具类

依赖 jackson-annotations-2.8.0.jar、jackson-core-2.8.6.jar、jackson-databind-2.8.6.jar 包

package xxx;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;  
public class JacksonUtil
{
	private static ObjectMapper objectMapper = null;

	private static void init()
	{
		objectMapper = new ObjectMapper();
	}
        //对象转成Json字符串
	public static String bean2Json(Object obj) throws JsonProcessingException 
	{
		if (objectMapper == null)
		{
			init();
		}
		return objectMapper.writeValueAsString(obj);
	}
	//字符串转成对象
	public static <T> T json2Bean(String str, Class<T> type) throws JsonParseException, JsonMappingException, IOException 
	{
		if (objectMapper == null)
		{
			init();
		}
		return objectMapper.readValue(str, type);
	}
	
}

调用方式在前面的代码里有,自己测下就明白了。


猜你喜欢

转载自blog.csdn.net/u010170616/article/details/80853200