这部分其实只有一个技术点,只是对于像我这种菜鸟来说一开始接触有点懵。
首先介绍一下HTTP报文的格式(微信公众平台会向后台发送一个HTTP请求,然后把后台反馈的HTTP响应呈现给用户)。
- HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
request.getParameter("");//获得请求头部的数据
InputStream is = request.getInputStream();//获取请求数据
通过微信的开发者手册,我们可以知道,平台发往后台的HTTP请求包含一段XML数据,但是没有提到键值的名称(头部字段名),所以请求是POST请求,这段数据在“请求数据”字段中,所以使用request.getInputStream()获取请求数据。
以下是一段实例代码:
@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1571151842377184202L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
request.getParameter("");
/** 读取接收到的xml消息 */
StringBuffer sb = new StringBuffer();
InputStream is = request.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String s = "";
while ((s = br.readLine()) != null) {
sb.append(s);
}
String xml = sb.toString(); // 微信端发送过来的xml数据
System.out.println(request.getParameterMap());
System.out.println(xml);
String result = "";
/** 判断是否是微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回 */
String echostr = request.getParameter("echostr");
if (echostr != null && echostr.length() > 1) {
result = echostr;
} else {
// 正常的微信处理流程
if(!StringUtils.isBlank(xml)){
result = Processor.processor(xml);
}
System.out.println(result);
}
try {
OutputStream os = response.getOutputStream();
os.write(result.getBytes("UTF-8"));
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
至于Servlet响应的话,输出到页面就行了(当然得按照微信定的规则来)
OutputStream os = response.getOutputStream();
os.write(result.getBytes("UTF-8"));
os.flush();
os.close();