3.1 解析微信发来的请求

    微信服务器发来的请求消息都被封装在request对象中,可以从request对象中将请求参数取出来。通常是用request的getParament()方法获取请求中的参数,而在这里需要使用request对象的getInputStream()方法。通过getInputStream()方法获得输入流,再使用Dome4j读取输入流并解析XML格式的请求,最后将参数放入HashMap中。这样在我们调用此方法时就能轻易的得到回复消息时需要的对应参数。

  

/**
* 解析微信发来的请求(XML)
*
* @param request
* @return Map<String, String>
* @throws Exception
*/
//@SuppressWarnings("unchecked")
public static HashMap<String, String> parseXML(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
HashMap<String, String> map = new HashMap<String, String>(); // 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(request.getInputStream());
// 得到xml根元素
Element root = document.getRootElement(); recursiveParseXML(root,map); inputStream.close();
inputStream = null; return map;
}
private static void recursiveParseXML(Element root,HashMap<String, String> map){
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
//判断有没有子元素列表
if(elementList.size() == 0){
map.put(root.getName(), root.getText());
}else{
//遍历
for (Element e : elementList){
recursiveParseXML(e,map);
}
}
}

   3.2 回复消息封装成XML

    公众号服务器在接受并处理完消息后,需要返回特定格式的XML结构进行响应。这里我们使用的是XStream库。

  

/**
* 扩展xstream使其支持CDATA
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true; //@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
} protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
/**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String messageToXML(TextMessage textMessage) {
xstream.alias("xml", TextMessage.class);
return xstream.toXML(textMessage);
} /**
* 图片消息对象转换成xml
*
* @param imageMessage 图片消息对象
* @return xml
*/
public static String messageToXML(ImageMessage imageMessage) {
xstream.alias("xml", ImageMessage.class);
return xstream.toXML(imageMessage);
}
/**
* 语音消息对象转换成xml
*
* @param voiceMessage 语音消息对象
* @return xml
*/
public static String messageToXML(VoiceMessage voiceMessage) {
xstream.alias("xml", VoiceMessage.class);
return xstream.toXML(voiceMessage);
} /**
* 视频消息对象转换成xml
*
* @param videoMessage 视频消息对象
* @return xml
*/
public static String messageToXML(VideoMessage videoMessage) {
xstream.alias("xml", VideoMessage.class);
return xstream.toXML(videoMessage);
}

    完整代码:

package com.util;

import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import com.message.ImageMessage;
import com.message.TextMessage;
import com.message.VideoMessage;
import com.message.VoiceMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver; /**
*
* @author 黄路飞
*
* @data 2016年6月18日21:56:47
*/
public class MessageUtil {
// 请求消息类型:文本
public static final String REQ_MESSAGE_TYPE_TEXT = "text";
// 请求消息类型:图片
public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
// 请求消息类型:语音
public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
// 请求消息类型:视频
public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
// 请求消息类型:地理位置
public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
// 请求消息类型:链接
public static final String REQ_MESSAGE_TYPE_LINK = "link"; // 请求消息类型:事件推送
public static final String REQ_MESSAGE_TYPE_EVENT = "event"; // 事件类型:subscribe(订阅)
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
// 事件类型:unsubscribe(取消订阅)
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
// 事件类型:scan(用户已关注时的扫描带参数二维码)
public static final String EVENT_TYPE_SCAN = "scan";
// 事件类型:LOCATION(上报地理位置)
public static final String EVENT_TYPE_LOCATION = "LOCATION";
// 事件类型:CLICK(自定义菜单)
public static final String EVENT_TYPE_CLICK = "CLICK"; // 响应消息类型:文本
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
// 响应消息类型:图片
public static final String RESP_MESSAGE_TYPE_IMAGE = "image";
// 响应消息类型:语音
public static final String RESP_MESSAGE_TYPE_VOICE = "voice";
// 响应消息类型:视频
public static final String RESP_MESSAGE_TYPE_VIDEO = "video";
// 响应消息类型:音乐
public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
// 响应消息类型:图文
public static final String RESP_MESSAGE_TYPE_NEWS = "news"; /**
* 解析微信发来的请求(XML)
*
* @param request
* @return Map<String, String>
* @throws Exception
*/
//@SuppressWarnings("unchecked")
public static HashMap<String, String> parseXML(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
HashMap<String, String> map = new HashMap<String, String>(); // 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(request.getInputStream());
// 得到xml根元素
Element root = document.getRootElement(); recursiveParseXML(root,map); inputStream.close();
inputStream = null; return map;
} private static void recursiveParseXML(Element root,HashMap<String, String> map){
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
//判断有没有子元素列表
if(elementList.size() == 0){
map.put(root.getName(), root.getText());
}else{
//遍历
for (Element e : elementList){
recursiveParseXML(e,map);
}
}
} /**
* 扩展xstream使其支持CDATA
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true; //@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
} protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
}); /**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String messageToXML(TextMessage textMessage) {
xstream.alias("xml", TextMessage.class);
return xstream.toXML(textMessage);
} /**
* 图片消息对象转换成xml
*
* @param imageMessage 图片消息对象
* @return xml
*/
public static String messageToXML(ImageMessage imageMessage) {
xstream.alias("xml", ImageMessage.class);
return xstream.toXML(imageMessage);
} /**
* 语音消息对象转换成xml
*
* @param voiceMessage 语音消息对象
* @return xml
*/
public static String messageToXML(VoiceMessage voiceMessage) {
xstream.alias("xml", VoiceMessage.class);
return xstream.toXML(voiceMessage);
} /**
* 视频消息对象转换成xml
*
* @param videoMessage 视频消息对象
* @return xml
*/
public static String messageToXML(VideoMessage videoMessage) {
xstream.alias("xml", VideoMessage.class);
return xstream.toXML(videoMessage);
} }

微信开发03----------XML解析与封装的更多相关文章

  1. 微信开发(03)之新建按钮时报错 errcode 40054

    在微信开发新建公众号的按钮时,报错如下: {errcode:40054,errmsg:"invalid sub button url domain"} 经过仔细排查,发现是url地 ...

  2. 微信小程序xml解析

    准备: 下载xmldom库:https://github.com/jindw/xmldom 将dom.js.dom-parser.js.sax.js,entities.js拷贝微信小程序需要的文件夹下 ...

  3. XML详解:第三部分 XML解析

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. (5)微信二次开发 之 XML格式数据解析

    1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...

  5. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

  6. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  7. iOS开发之网络数据解析(二)--XML解析简介

    前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比 ...

  8. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  9. Android中微信抢红包插件原理解析和开发实现

    一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  10. iOS开发 XML解析和下拉刷新,上拉加载更多

    iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...

随机推荐

  1. Git 配置

    在 windows 上安装完 Git 会右键菜单中看到 Git 的快捷打开选项, 点 Git Bash Here 就可以在当前目录下打开 Git 的命令行 Git shell,初次使用 Git 先配置 ...

  2. C++ 知道虚函数表的存在

    今天翻看陈皓大大的博客,直接找关于C++的东东,看到了虚函数表的内容,找一些能看得懂的地方记下笔记. 0 引子 类中存在虚函数,就会存在虚函数表,在vs2015的实现中,它存在于类的头部. 假设有如下 ...

  3. ROS语音交互——科大讯飞语音合成TTS(二)

    之前我用过科大讯飞的语音包,为了记录一下我重新使用一下 首先注册科大讯飞账号及应用,以后每个下载的在线使用SDK都是以此账户ID登录讯飞语音服务器. 下载科大讯飞在线合成包. $ unzip Linu ...

  4. C# UdpClient使用Receive和BeginReceive接收消息时的不同写法

    使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = ); UdpClient udpCl ...

  5. c调用python

    #include <Python.h>//python33(python2.x有几个函数不对应) /* PyImport_ImportModule 导入一个Python模块并返回它的指针 ...

  6. C/C++程序员常去网站

    www.codeproject.comwww.codegru.comwww.chinaunix.netwww.csdn.netwww.vckbase.com http://www.google.com ...

  7. fc23升级fc24及字体问题解决

    1,升级fc23到最新 dnf upgrade --refresh 2,安装dnf系统升级插件 dnf install dnf-plugin-system-upgrade 3,下载fc24包,忽略无法 ...

  8. Spring 国际化

    http://www.xdemo.org/spring-i18n/ xxxx_zh_CN.properties中不允许保存中文,用jdk/bin目录下的native2ascii.exe将中文转化为Un ...

  9. VS2013+opencv2.4.9(10)配置[zz]

    1.         下载opencv2.4.9,然后解压到一个位置 设置opencv SDK解压目录,点击Extract后解压 我是习惯于解压到这个位置的. 解压过程如上图. 2.          ...

  10. yii2从零开始一,安装

    1.官网下载软件包 这里选择普通包,也可以是增强包 2.运行basic目录下 requirements.php ,查看环境是否符合要求,yii2要求php5.4以上 3.运行 basic/web下in ...