メッセージ受信先の明確化
メッセージの受信、処理、応答
ここで、私がすでに書いたCoreServletの完全なコードを最初に見てみましょう:
package org.liufeng.course.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.liufeng.course.service.CoreService;
import org.liufeng.course.util.SignUtil;
/**
* コア・リクエスト処理クラス
*
*
*
*/
public class CoreServlet extends HttpServlet {
private static final long serialVersionUID = 4440739483644821986L;
/**
* リクエストがサーバーから来たことを確認する
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 暗号化された署名
String signature = request.getParameter("signature");
// タイムスタンプ
String timestamp = request.getParameter("timestamp");
// 乱数
String nonce = request.getParameter("nonce");
// ランダム文字列
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
// 検証要求の署名をチェックすることで、検証が成功すれば、そのままechostrを返し、アクセスが成功したことを示し、そうでなければアクセス失敗を示す
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
out.close();
out = null;
}
/**
* サーバーからのメッセージを処理する
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// リクエストとレスポンスのエンコーディングをUTF-8に設定する。
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// コア・ビジネス・クラスを呼び出してメッセージを受信し、メッセージを処理する。
String respMessage = CoreService.processRequest(request);
// 応答メッセージ
PrintWriter out = response.getWriter();
out.print(respMessage);
out.close();
}
}
コードの説明
2) 52行目のコード:メッセージに応答して、エンコード方式もUTF-8に設定します;
3) 54行目のコード:CoreServiceクラスのprocessRequestメソッドを呼び出し、メッセージを受信して処理し、結果を取得します;
4) 57~59行目:response.getWriter().write()メソッドを呼び出し、メッセージの処理結果をユーザーに返します。
doPostメソッドの実装から見ることができる、それはCoreServiceクラスのprocessRequestメソッドを呼び出して受信し、メッセージを処理することで、そうすることの目的は、結合を解除することです、つまり、ビジネス関連の操作は、サーブレットでは処理されませんが、完全にコアビジネスクラスCoreServiceで行うことです。以下は、CoreServiceクラスのコードの実装を見てください:
package org.liufeng.course.service;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.liufeng.course.message.resp.TextMessage;
import org.liufeng.course.util.MessageUtil;
/**
* コア・サービス・クラス
*
*
*
*/
public class CoreService {
/**
* 受信リクエストの処理
*
* @param request
* @return
*/
public static String processRequest(HttpServletRequest request) {
String respMessage = null;
try {
// デフォルトのリターン・テキスト・メッセージの内容
String respContent = "リクエスト処理の例外、試行するまでお待ちください!";
// xmlリクエストの解析
Map<String, String> requestMap = MessageUtil.parseXml(request);
// 送信者アカウント(オープン)_id)
String fromUserName = requestMap.get("FromUserName");
//
String toUserName = requestMap.get("ToUserName");
// メッセージの種類
String msgType = requestMap.get("MsgType");
// テキストメッセージを返信する
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
// テキスト・メッセージ
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
respContent = "テキストメッセージを送信しています!";
}
// イメージメッセージ
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "イメージメッセージを送信しています!";
}
// 地理的位置メッセージ
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "ジオロケーション・メッセージを送信しています!";
}
// リンクメッセージ
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "リンク・メッセージを送信しています!";
}
// 音声メッセージ
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "音声メッセージを送信しています!";
}
// イベント・プッシュ
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
// イベントタイプ
String eventType = requestMap.get("Event");
//
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
respContent = "注目してくれてありがとう;
}
// 配信停止
else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// TODO サブスクリプションをキャンセルすると、ユーザーは送信されたメッセージを受信できなくなるので、メッセージに返信する必要はない。
}
// カスタムメニュークリックイベント
else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
// TODO メニューをカスタマイズする権利は開かれておらず、このタイプのメッセージは当面扱われない。
}
}
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} catch (Exception e) {
e.printStackTrace();
}
return respMessage;
}
}
コードの説明
2) 32~36行目:HashMapからメッセージのフィールドを取り出します;
3) 39~44行目、84行目:返すテキストメッセージオブジェクトを組み立てます;
(5) 85行目:メッセージツールクラスのMessageUtilを呼び出し、テキストメッセージオブジェクトTextMessageをxml形式の文字列に変換して返します;
イベントプッシュについて
テキストメッセージ、イメージメッセージ、ジオロケーションメッセージ、リンクメッセージや音声メッセージのようなメッセージの種類の判断のために、比較的よく理解されている、ちょうどイベントプッシュメッセージと接触している友人の多くは、メッセージの用途が何であるかを把握することはできません、またはユーザーの注目のメッセージを判断する方法が明確ではありません。次に、具体的にイベントプッシュを見て、次の図は、イベントプッシュの説明に関する公式メッセージインターフェイスのドキュメントです:




