java实现HTTP的post请求 json格式中文乱码问题

0. 前言

之前写过接口接收json格式的post请求,当时自己测试返回响应时出现过乱码,但因对方处理说是正常显示,就没有深入思考,最近要写一个发送端,在发送和接收返回响应时都出现过乱码,最后算是解决了,目前尝试过的框架为SpringMVC和jfinal,这两种情况我会分别在最后说明。先说客户端的发送与响应。

1. 样例

1.1 jar包准备

本文中用的json与字符串转换类 net.sf.json.JSONObject
其他转换类都可以,只要符合json格式,在传输过程中都是现转换为json格式的字符串,在转换为字符流传输。
要使用此方法转换,必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包:

  • commons-lang.jar
  • commons-beanutils.jar
  • commons-collections.jar
  • commons-logging.jar
  • ezmorph.jar
  • json-lib-2.2.2-jdk15.jar

1.2. 样例

此方法是为了方便自己开发,传入和返回皆为JSONObject,其实本质也可以直接传入和返回字符串,看具体需求吧。

/**
 * 向指定URL发送post方法的请求,请求内容为json格式的字符串
 * @param urlString
 * @param jsonObject 
 * @return JSONObject 直接返回json对象
 */
public static JSONObject postJson(String urlString ,JSONObject jsonObject) {
		JSONObject returnJson = null;
		try {
			// 创建连接
			URL url = new URL(urlString);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setRequestMethod("POST");
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setUseCaches(false);
			connection.setInstanceFollowRedirects(true);			
			connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");//**注意点1**,需要此格式,后边这个字符集可以不设置
			connection.connect();
			DataOutputStream out = new DataOutputStream(
					connection.getOutputStream());
			out.write(jsonObject.toString().getBytes("UTF-8"));//**注意点2**,需要此格式
			out.flush();
			out.close();
			// 读取响应
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					connection.getInputStream(),"utf-8"));//**注意点3**,需要此格式
			String lines;
			StringBuffer sb = new StringBuffer("");
			while ((lines = reader.readLine()) != null) {
				sb.append(lines);
			}
			System.out.println("sb:"+sb);			
			returnJson = JSONObject.fromObject(sb.toString());
			reader.close();
			// 断开连接
			connection.disconnect();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return returnJson;
	}

2. 分别介绍一下如何用SpringMVC和jfinal接收

2.1. SpringMVC接收

(1)首先开启Spring注解
<mvc:annotation-driven />

(2)其次要添加springMVC需要添加如下配置
只提供Spring4.x的配置,3的配置差不多,自己搜一下吧

配置文件

spring4.x配置:
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonHttpMessageConverter" />
            </list>
        </property>
    </bean>
    <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
              	<value>text/html;charset=UTF-8</value>
				<!-- 注意 这是传输json格式,无论是ajax还是外部接口传输-->
				<value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>

(3)最后controller中接收

//接收实体中可以用三种方式,本质是Map格式的实体,HttpEntity格式需要getbody()才可以获取json格式的字符串,也可以传实体类,项目因为接收数据复杂,还需保存原始数据,所以没有用实体类。
@RequestMapping(value = "你的地址",method=RequestMethod.POST,consumes="application/json")
	@ResponseBody()
	public Object dataReceive(@RequestBody JSONObject obj ,ServletRequest request){
return JSONObject;//json对象
}
	public Object dataReceive(HttpEntity<JSONObject>  obj ,ServletRequest request){
	return JSONObject;//json对象
	}
	public Object dataReceive(Map <String,Object>m ,ServletRequest request){
		return JSONObject;//json对象
	}

2.2. jfinal接收

主要是跳过拦截时的方法与SpringMVC不一样。

	@Clear//跳过验证(例如session)
	public void index() {
		StringBuilder json = new StringBuilder(); 
		try {
			HttpServletRequest request =  this.getRequest();
			BufferedReader reader = request.getReader();
			String line = null;
			while ((line = reader.readLine()) != null) {
							json.append(line);	
			}
			reader.close();		
		} catch (Exception e) {
			// TODO: handle exception
		}
		JSONObject json= JSONObject.fromObject(json.toString());
		...
		...
		renderJson(你要返回的json对象);
	}

如果有什么错误的地方,请大家指出。

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于 HTTP POST 请求,其请求报文包体可能包含请求参数、JSON 数据、XML 数据等多种类型。在 Java 中解析 HTTP POST 请求报文包体的方法也因此而异,下面将分别介绍不同类型请求体的解析方法。 1. 请求参数类型 对于请求参数类型的请求体,可以通过 HttpServletRequest 对象的 getParameter() 方法获取请求参数。在使用该方法之前,需要先设置请求体的字符编码为 UTF-8,否则可能会出现中文乱码的情况。 ```java request.setCharacterEncoding("UTF-8"); String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); // ... ``` 2. JSON 数据类型 对于 JSON 数据类型的请求体,可以使用 Gson 库将 JSON 数据转化为 Java 对象。在使用 Gson 之前需要先引入该库,可以通过 Maven 或 Gradle 等方式进行引入。 ```java Gson gson = new Gson(); MyObject myObject = gson.fromJson(request.getReader(), MyObject.class); // ... ``` 其中,MyObject 是一个 Java 类,用于表示 JSON 数据。 3. XML 数据类型 对于 XML 数据类型的请求体,可以使用 Java 自带的 SAX 或 DOM 解析器进行解析。以 SAX 解析器为例,其解析过程如下: ```java SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); MyHandler handler = new MyHandler(); parser.parse(request.getInputStream(), handler); MyObject myObject = handler.getMyObject(); // ... ``` 其中,MyHandler 是一个实现了 SAXHandler 接口的 Java 类,用于解析 XML 数据,并将解析结果封装在 MyObject 对象中。 需要注意的是,在使用 SAX 或 DOM 解析器解析 XML 数据时,需要先对 XML 数据进行格式化,以便于解析器能够正确解析。 ```java TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StreamResult result = new StreamResult(new StringWriter()); DOMSource source = new DOMSource(document); transformer.transform(source, result); String xmlString = result.getWriter().toString(); ``` 在以上代码中,我们使用 DOM 解析器将 XML 数据转化为 Document 对象,并将其格式化为字符串形式。 以上就是 Java 解析 HTTP POST 请求报文包体的基本方法,需要根据不同的请求体类型进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值