精华内容
下载资源
问答
  • HTTP的请求消息和响应消息

    千次阅读 2019-05-30 08:37:51
    1.请求消息 请求消息: ...2.响应消息 响应消息: 状态行(状态码) 消息头(规定信息) 消息体(包含服务器向客户端发送的数据) 参考文章:https://www.cnblogs.com/yumo1627129/p/7941220.html ...

    1.请求消息

    请求消息:
    请求行(大致了解请求的内容)
    消息头(请求的附加信息,对请求和接收数据的一些规定)
    消息体(客户端向服务器发送的数据)

    在这里插入图片描述

    2.响应消息

    响应消息:
    状态行(状态码)
    消息头(规定信息)
    消息体(包含服务器向客户端发送的数据)

    在这里插入图片描述

    3.HTTP请求解析过程(简单概括)

    HTTP请求解析过程 (简单概括)

    1.域名解析
    用户输入网址,由域名系统DNS解析输入的网址;

    2.TCP的3次握手
    通过域名解析出的IP地址来向web服务器发起TCP连接请求,如果3次握手通过,则与web服务端建立了可靠的连接;

    3.发送http请求
    web客户端向web服务端发送请求;

    4.接收http响应
    web客户端接收来自web服务端的响应,包含各种根据请求反馈的数据;

    5.web客户端(浏览器)解释响应
    最后由浏览器解析响应里的数据,即HTML代码,以及HTML代码中请求的资源,然后由浏览器呈现给用户。

    参考文章:https://www.cnblogs.com/yumo1627129/p/7941220.html

    展开全文
  • CMFCPropertyGridCtrl响应消息

    千次阅读 2013-05-05 00:15:55
    CMFCPropertyGridCtrl响应消息   2013-5-5 flyfish www.boboding.com   一 类的继承关系 class CMFCPropertyGridCtrl : publicCWnd class CMFCPropertyGridProperty : public CObject     查看...

     CMFCPropertyGridCtrl响应消息

     

    2013-5-5 flyfish www.boboding.com

     

    一 类的继承关系

    class CMFCPropertyGridCtrl : publicCWnd

    class CMFCPropertyGridProperty : public CObject

     

     

    查看CMFCPropertyGridCtrl的源码

    //Overrides

             virtualvoidOnPropertyChanged(CMFCPropertyGridProperty* pProp) const;

     

     

    voidCMFCPropertyGridCtrl::OnPropertyChanged(CMFCPropertyGridProperty* pProp) const

    {

             ASSERT_VALID(this);

             ASSERT_VALID(pProp);

     

             pProp->SetModifiedFlag();

     

             GetOwner()->SendMessage(AFX_WM_PROPERTY_CHANGED,GetDlgCtrlID(), LPARAM(pProp));

    }

     

    这里我们可以重写OnPropertyChanged

     

    二新建一个基于对话框的项目,对话框类是CDlgXXX

    头文件增加

    afx_msg LRESULTOnPropertyChanged(__in WPARAM wparam, __in LPARAM lparam );

     

    消息映射的地方增加

    ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, &CDlgXXX:OnPropertyChanged )

     

    实现文件增加

    LRESULT CDlgXXX::OnPropertyChanged(__in WPARAM wparam, __in  LPARAM lparam )

    {

            

             return0;

    }

     

    三区分操作PropertyGrid某个Item的方法

    一个ProtertyGrid可以多个Property,一个Property可以有多个Item,一个Item可以是Edit,可以是ComboBox,因为没有ID,要人为的区分。

     

    方法如下

    在对话框的头文件中定义

             CMFCPropertyGridCtrl  m_PropertyGrid_ctlMain;

             CMFCPropertyGridProperty*   m_pProperty;

     

    CMFCPropertyGridProperty的构造函数

                      CMFCPropertyGridProperty(const CString& strName, constCOleVariant& varValue, LPCTSTR lpszDescr = NULL, DWORD_PTR dwData = 0,

                       LPCTSTR lpszEditMask = NULL,LPCTSTR lpszEditTemplate = NULL, LPCTSTR lpszValidChars = NULL);

     

     

    第四个参数DWORD_PTRdwData,使用这个参数作为区分操作了哪个控件

     

    m_pProperty1=new CMFCPropertyGridProperty(_T("标题"));

    m_pProperty1->AddSubItem(new CMFCPropertyGridProperty(_T("属性"), (COleVariant) _T(""), _T(""),1));

    最后一个参数值为1,这个1就相当于一个控件的ID。

     

     

    LRESULT CDlgXXX::OnPropertyChanged(__in WPARAM wparam, __in  LPARAM lparam )

    {

             CMFCPropertyGridProperty* pProp = reinterpret_cast<CMFCPropertyGridProperty*>(lparam);

             intnID=pProp->GetData();

             if (1==nID)

             {

    //自定义的操作

    }

    return 0;

     

    }

     

    注意

    如果使用的字符集非UnicodeMFC的使用不是在静态库中使用MFC库,如果要使用AfxMessageBox提示内容,之前要加SetFocus(),如果不加,当CMFCPropertyGridProperty中的某个Item是一个ComboBox类型的时就会出错。

     

     

    展开全文
  • 接收消息与响应消息;被动响应消息;接收事件(菜单事件、关注/取消关注事件、坐标事件、异步任务完成事件);发送消息(消息推送);自定义菜单;OAuth验证;Userid与openid互换;微信JS-SDK接口(重点);企业会话...
  • HTTP—请求和响应消息的结构

    千次阅读 2020-08-14 21:18:34
    HTTP请求消息和响应消息具有相似的结构,由以下部分组成︰ start line:一行起始行用于描迹要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。 **HTTP headers:**一个可选的HTTP头集合指明请求或...

    HTTP消息结构

    HTTP请求消息和响应消息具有相似的结构,由以下部分组成︰

    1. start line:一行起始行用于描迹要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
    2. **HTTP headers:**一个可选的HTTP头集合指明请求或描迹消息正文。
    3. empty line:一个空行指示所有关于请求的元数据已经发送完毕。
    4. body:一个可选的包含请求相关数据的正文(比如HTML表单内容),或者响应相关的文档。正文的大小有起始行的HTTP头来指定。

    起始行和HTTP消息中的HTTP头统称为“请求头”,而其有效负载被称为“消息正文”。

    1. 请求消息与响应消息

      **HTTP请求消息:**由客户端发送用来触发一个服务器上的动作。

      HTTP响应消息:来自服务器的应答。

    作。

    HTTP响应消息:来自服务器的应答。

    diS5Wt.jpg

    展开全文
  • 微信企业号开发之接收响应消息

    千次阅读 2015-05-12 12:45:43
    上一篇讲了企业号如何开启...客户端发送的消息微信会推送到回调模式中设置的URL中去,接收和响应消息的格式都为xml形式,消息分为以下几种类型: text消息 1348831860 1234567890123456 1 参数 说明

    上一篇讲了企业号如何开启回调模式,回调模式开启成功后,企业号后台服务器就可以接收和响应客户端发来的消息。客户端发送的消息微信会推送到回调模式中设置的URL中去,接收和响应消息的格式都为xml形式,消息分为以下几种类型:

    text消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName> 
       <CreateTime>1348831860</CreateTime>
       <MsgType><![CDATA[text]]></MsgType>
       <Content><![CDATA[this is a test]]></Content>
       <MsgId>1234567890123456</MsgId>
       <AgentID>1</AgentID>
    </xml>
    
    参数 说明
    ToUserName 企业号CorpID
    FromUserName 成员UserID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:text
    Content 文本消息内容
    MsgId 消息id,64位整型
    AgentID 企业应用的id,整型。可在应用的设置页面查看


    image消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1348831860</CreateTime>
       <MsgType><![CDATA[image]]></MsgType>
       <PicUrl><![CDATA[this is a url]]></PicUrl>
       <MediaId><![CDATA[media_id]]></MediaId>
       <MsgId>1234567890123456</MsgId>
       <AgentID>1</AgentID>
    </xml>
    
    参数 说明
    ToUserName 企业号CorpID
    FromUserName 成员UserID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:image
    PicUrl 图片链接
    MediaId 图片媒体文件id,可以调用获取媒体文件接口拉取数据
    MsgId 消息id,64位整型
    AgentID 企业应用的id,整型。可在应用的设置页面查看


    voice消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1357290913</CreateTime>
       <MsgType><![CDATA[voice]]></MsgType>
       <MediaId><![CDATA[media_id]]></MediaId>
       <Format><![CDATA[Format]]></Format>
       <MsgId>1234567890123456</MsgId>
       <AgentID>1</AgentID>
    </xml>
    
    参数 说明
    ToUserName 企业号CorpID
    FromUserName 成员UserID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:voice
    MediaId 语音媒体文件id,可以调用获取媒体文件接口拉取数据
    Format 语音格式,如amr,speex等
    MsgId 消息id,64位整型
    AgentID 企业应用的id,整型。可在应用的设置页面查看


    video消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1357290913</CreateTime>
       <MsgType><![CDATA[video]]></MsgType>
       <MediaId><![CDATA[media_id]]></MediaId>
       <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
       <MsgId>1234567890123456</MsgId>
       <AgentID>1</AgentID>
    </xml>
    
    参数 说明
    ToUserName 企业号CorpID
    FromUserName 成员UserID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:video
    MediaId 视频媒体文件id,可以调用获取媒体文件接口拉取数据
    ThumbMediaId 视频消息缩略图的媒体id,可以调用获取媒体文件接口拉取数据
    MsgId 消息id,64位整型
    AgentID 企业应用的id,整型。可在应用的设置页面查看


    location消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1351776360</CreateTime>
       <MsgType><![CDATA[location]]></MsgType>
       <Location_X>23.134521</Location_X>
       <Location_Y>113.358803</Location_Y>
       <Scale>20</Scale>
       <Label><![CDATA[位置信息]]></Label>
       <MsgId>1234567890123456</MsgId>
       <AgentID>1</AgentID>
    </xml>
    
    参数 说明
    ToUserName 企业号CorpID
    FromUserName 成员UserID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:location
    Location_X 地理位置纬度
    Location_Y 地理位置经度
    Scale 地图缩放大小
    Label 地理位置信息
    MsgId 消息id,64位整型
    AgentID 企业应用的id,整型。可在应用的设置页面查看

    注:以上信息摘自微信官方文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF)

    响应的消息分为以下几种类型:

    text消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName> 
       <CreateTime>1348831860</CreateTime>
       <MsgType><![CDATA[text]]></MsgType>
       <Content><![CDATA[this is a test]]></Content>
    </xml>
    
    参数 说明
    ToUserName 成员UserID
    FromUserName 企业号CorpID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:text
    Content 文本消息内容


    image消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1348831860</CreateTime>
       <MsgType><![CDATA[image]]></MsgType>
       <Image>
           <MediaId><![CDATA[media_id]]></MediaId>
       </Image>
    </xml>
    
    参数 说明
    ToUserName 成员UserID
    FromUserName 企业号CorpID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:image
    MediaId 图片文件id,可以调用上传媒体文件接口获取


    voice消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1357290913</CreateTime>
       <MsgType><![CDATA[voice]]></MsgType>
       <Voice>
           <MediaId><![CDATA[media_id]]></MediaId>
       </Voice>
    </xml>
    
    参数 说明
    ToUserName 成员UserID
    FromUserName 企业号CorpID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:voice
    MediaId 语音文件id,可以调用上传媒体文件接口获取


    video消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>1357290913</CreateTime>
       <MsgType><![CDATA[video]]></MsgType>
       <Video>
           <MediaId><![CDATA[media_id]]></MediaId>
           <Title><![CDATA[title]]></Title>
           <Description><![CDATA[description]]></Description>
       </Video>
    </xml>
    
    参数 说明
    ToUserName 成员UserID
    FromUserName 企业号CorpID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:video
    MediaId 视频文件id,可以调用上传媒体文件接口获取
    Title 视频消息的标题
    Description 视频消息的描述


    news消息

    <xml>
       <ToUserName><![CDATA[toUser]]></ToUserName>
       <FromUserName><![CDATA[fromUser]]></FromUserName>
       <CreateTime>12345678</CreateTime>
       <MsgType><![CDATA[news]]></MsgType>
       <ArticleCount>2</ArticleCount>
       <Articles>
           <item>
               <Title><![CDATA[title1]]></Title> 
               <Description><![CDATA[description1]]></Description>
               <PicUrl><![CDATA[picurl]]></PicUrl>
               <Url><![CDATA[url]]></Url>
           </item>
           <item>
               <Title><![CDATA[title]]></Title>
               <Description><![CDATA[description]]></Description>
               <PicUrl><![CDATA[picurl]]></PicUrl>
               <Url><![CDATA[url]]></Url>
           </item>
       </Articles>
    </xml>
    
    参数 说明
    ToUserName 成员UserID
    FromUserName 企业号CorpID
    CreateTime 消息创建时间(整型)
    MsgType 消息类型,此时固定为:news
    ArticleCount 图文条数,默认第一条为大图。图文数不能超过10,否则将会无响应
    Title 图文消息标题
    Description 图文消息描述
    PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
    Url 点击图文消息跳转链接


    注:以上信息摘自微信官方文档

    http://qydev.weixin.qq.com/wiki/index.php?title=%E8%A2%AB%E5%8A%A8%E5%93%8D%E5%BA%94%E6%B6%88%E6%81%AF)

    下面我们以接收并响应文本消息为例,说明如何接收和响应消息。

    我们都习惯于面向对象编程,所以在写具体逻辑代码之前我们先写几个实体类。我们看到无论是接收的消息,还是响应的消息都有一些共同的属性,所以我们可以把这部分属性提出来放到一个父类里面,由于接收到的消息可以使用另一种方式解析(后面的代码中会体现出来),所以我们只需要转化响应的消息格式即可,代码如下:

    package com.weixin.model;
    
    public class MessageBaseResponse {
    	// 开发者微信号    
    	private String ToUserName;    
    	// 发送方账号(一个OpenID)    
    	private String FromUserName;    
    	// 消息创建时间 (整型)    
    	private long CreateTime;    
    	// 消息类型(text/image/location/link/voice)   
    	private String MsgType; 
    	
    	public String getFromUserName() {
    		return FromUserName;
    	}
    
    	public void setFromUserName(String fromUserName) {
    		FromUserName = fromUserName;
    	}
    
    	public long getCreateTime() {
    		return CreateTime;
    	}
    
    	public void setCreateTime(long createTime) {
    		CreateTime = createTime;
    	}
    
    	public String getMsgType() {
    		return MsgType;
    	}
    
    	public void setMsgType(String msgType) {
    		MsgType = msgType;
    	}
    
    	public String getToUserName() {        
    		return ToUserName;    
    	}    
    	
    	public void setToUserName(String toUserName) {        
    		ToUserName = toUserName;    
    	}
    }
    

    响应文本消息的实体类代码如下:

    package com.weixin.model;
    
    public class MessageTextResponse extends MessageBaseResponse{
    	// 消息内容    
    	private String Content;    
    	
    	public String getContent() {        
    		return Content;    
    	}    
    	
    	public void setContent(String content) {        
    		Content = content;    
    	}
    }

    文本消息继承了MessageBaseResponse父类。上一篇我们提到过在开启回调模式的时候,需要用get方式访问我们填写的URL来效验,那么什么时候用post方式呢,就是微信将客户端发送的消息推送到企业号后台服务器的时候,下面附上上一篇文章中servlet的代码,只不过在其中的post提交中加入了一些代码。

    package com.weixin.qiye;
    
    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 com.weixin.utils.CoreService;
    import com.weixin.utils.WXBizMsgCrypt;
    
    public class CoreServlet extends HttpServlet{
    
    	private static final long serialVersionUID = -1580490945554184292L;
    	public static final String STOKEN = "leonjo";    
    	public static final String SCORPID = "wxf75e841610aaaaaaa";    
    	public static final String SENCODINGAESKEY = "JsIS65d9UAslnaIY3aMRXVOxD6hWMD2tjyx5zOwfR5Q";    
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		try {
    			WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(STOKEN,SENCODINGAESKEY,SCORPID);
    			// 解析出url上的参数值如下:
    			String sVerifyMsgSig = request.getParameter("msg_signature");
    			String sVerifyTimeStamp = request.getParameter("timestamp");
    			String sVerifyNonce = request.getParameter("nonce");
    			String sVerifyEchoStr = request.getParameter("echostr");
    			String sEchoStr; //需要返回的明文
    			sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
    					sVerifyNonce, sVerifyEchoStr);
    			// 验证URL成功,将sEchoStr返回
    			PrintWriter out = response.getWriter();
    			out.print(sEchoStr);
    			
    		} catch (Exception e) {
    			PrintWriter out = response.getWriter();
    			out.print(e);
    			//验证URL失败,错误原因请查看异常
    			e.printStackTrace();
    		}
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		try {
    			WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(STOKEN,SENCODINGAESKEY,SCORPID);
    			String respXml = CoreService.processQiyeRequest(request,wxcpt);
    			PrintWriter out = response.getWriter();
    			out.print(respXml);
    		} catch (Exception e) {
    			//验证URL失败,错误原因请查看异常
    			e.printStackTrace();
    		}
    	}
    }
    

    以上代码的关键部分是CoreService类的processQiyeRequest方法,负责处理接收到的消息并获取响应的消息,代码如下:

    package com.weixin.utils;
    
    import java.io.StringReader;
    import java.util.Date;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.apache.log4j.Logger;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
    
    import com.weixin.model.EventQRCode;
    import com.weixin.model.MessageQiyeResponse;
    import com.weixin.model.MessageTextRequest;
    import com.weixin.model.MessageTextResponse;
    
    public class CoreService {
    
    	public static String processQiyeRequest(HttpServletRequest request,WXBizMsgCrypt wxcpt){
    	
    		// XML格式的消息数据        
    		String respXml = null;        
    		// 默认返回的文本消息内容       
    		try {            
    			// 调用parseXml方法解析请求消息            
    			Map<String, String> requestMap = MessageUtil.parseXml(request);    
    			// 发送方账号            
    			String encrypt = requestMap.get("Encrypt");            
    			// 开发者微信号            
    			String toUserName = requestMap.get("ToUserName");            
    			// 开发者微信号            
    			String agentID = requestMap.get("AgentID");            
    			// 回复文本消息            
    			MessageQiyeResponse messageQiyeResponse = new MessageQiyeResponse();            
    			messageQiyeResponse.setToUserName(toUserName);
    			messageQiyeResponse.setEncrypt(encrypt);
    			messageQiyeResponse.setAgentID(agentID);
    			// 将文本消息对象转换成XML            
    			respXml = MessageUtil.messageToXml(messageQiyeResponse);
    			
    			String sVerifyMsgSig = request.getParameter("msg_signature");
    			String sVerifyTimeStamp = request.getParameter("timestamp");
    			String sVerifyNonce = request.getParameter("nonce");
    			String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, respXml);
    			String msgType = getMsgType(sMsg);
    			// 回复文本消息            
    			MessageTextResponse textMessage = new MessageTextResponse();            
    			textMessage.setFromUserName(toUserName);            
    			textMessage.setCreateTime(new Date().getTime());
    			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
    			
    			// 文本消息            
    			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {                
    				MessageTextRequest messageTextRequest = (MessageTextRequest) MessageUtil.xmlToObject(new MessageTextRequest(), sMsg);
    				textMessage.setToUserName(messageTextRequest.getFromUserName());
    				textMessage.setContent("您输入的是"+messageTextRequest.getContent());
    			}            
    			// 图片消息            
    			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {                
    			}            
    			// 语音消息           
    			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {                
    			}
    			// 视频消息            
    			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) {                
    			}
    			// 地理位置消息
    			else if (msgType.equals((MessageUtil.REQ_MESSAGE_TYPE_LOCATION))) {                
    			}
    			// 链接消息            
    			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {                
    			}            
    			// 事件推送            
    			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {     
    				EventQRCode eventQRCode=(EventQRCode) MessageUtil.xmlToObject(new EventQRCode(), sMsg);
    				textMessage.setToUserName(eventQRCode.getFromUserName());
    				// 事件类型                
    				String eventType = requestMap.get("Event");  
    				if (eventType==null||eventType.equals("null")) {
    					textMessage.setContent("欢迎使用GRP系统,请操作下面的菜单来获得您所需要的数据");
    				}
    				// 关注                
    				else if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {     
    				}
    				// 取消关注               
    				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
    					
    				}
    				//扫描带参数二维码
    				else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {                    
    				}
    				// 上报地理位置               
    				else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {
    					
    				}
    				else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {                    
    				}
    			}
    			respXml = MessageUtil.messageToXml(textMessage);
    			respXml=wxcpt.EncryptMsg(respXml, sVerifyTimeStamp, sVerifyNonce);
    		}catch (Exception e) {   
    			e.printStackTrace();        
    		}
    		return respXml;
    	}
    	
    	public static String getMsgType(String xml) throws Exception{
    		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    		DocumentBuilder db = dbf.newDocumentBuilder();
    		StringReader sr = new StringReader(xml);
    		InputSource is = new InputSource(sr);
    		Document document = db.parse(is);
    
    		Element root = document.getDocumentElement();
    		NodeList nodelist1 = root.getElementsByTagName("MsgType");
    		String msgType = nodelist1.item(0).getTextContent();
    		return msgType;
    	}
    }
    

    这里面还需要一个工具类MessageUtil,负责处理xml转换成对象或者对象转成xml,代码如下:

    package com.weixin.utils;
    
    import java.io.InputStream;
    import java.io.Writer;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    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;
    import com.weixin.model.Article;
    import com.weixin.model.MessageImageRespone;
    import com.weixin.model.MessageMusicResponse;
    import com.weixin.model.MessageNewsResponse;
    import com.weixin.model.MessageQiyeResponse;
    import com.weixin.model.MessageTextResponse;
    import com.weixin.model.MessageVideoResponse;
    import com.weixin.model.MessageVoiceResponse;
    
    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
    	 * @throws Exception
    	 */
    	public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
    		
    		// 将解析结果存储在HashMap中    
    		Map<String, String> map = new HashMap<String, String>();    
    		// 从request中取得输入流    
    		InputStream inputStream = request.getInputStream();   
    		// 读取输入流    
    		SAXReader reader = new SAXReader();    
    		Document document = reader.read(inputStream);
    		// 得到XML根元素    
    		Element root = document.getRootElement();    
    		// 得到根元素的所有子节点    
    		List<Element> elementList = root.elements();    
    		// 遍历所有子节点    
    		for (Element e : elementList){
    			map.put(e.getName(), e.getText());    
    		}
    		// 释放资源    
    		inputStream.close();    
    		inputStream = null;    
    		return 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
    	 */
    	public static String messageToXml(MessageQiyeResponse messageQiyeResponse) {        
    		xstream.alias("xml", messageQiyeResponse.getClass());        
    		return xstream.toXML(messageQiyeResponse);        
    	}
    	/**
    	 * XML转换成消息对象
    	 * @param textMessage
    	 * @return
    	 */
    	public static Object xmlToObject(Object object,String xml) {        
    		xstream.alias("xml", object.getClass());        
    		return xstream.fromXML(xml);        
    	}
    	/**
    	 * 文本消息对象转换成XML
    	 * @param textMessage
    	 * @return
    	 */
    	public static String messageToXml(MessageTextResponse textMessage) {        
    		xstream.alias("xml", textMessage.getClass());        
    		return xstream.toXML(textMessage);        
    	}
    	/**
    	 * 图片消息对象转换成XML
    	 * @param imageMessage
    	 * @return
    	 */
    	public static String messageToXml(MessageImageRespone imageMessage) {        
    		xstream.alias("xml", imageMessage.getClass());        
    		return xstream.toXML(imageMessage);
    	}
    	/**
    	 * 语音消息对象转换成XML
    	 * @param voiceMessage
    	 * @return
    	 */
    	public static String messageToXml(MessageVoiceResponse voiceMessage) {        
    		xstream.alias("xml", voiceMessage.getClass());        
    		return xstream.toXML(voiceMessage);    
    	}
    	/**
    	 * 视频消息对象转换成XML
    	 * @param videoMessage
    	 * @return
    	 */
    	public static String messageToXml(MessageVideoResponse videoMessage) {        
    		xstream.alias("xml", videoMessage.getClass());        
    		return xstream.toXML(videoMessage);    
    	}
    	/**
    	 * 音乐消息对象转换成XML
    	 * @param musicMessage
    	 * @return
    	 */
    	public static String messageToXml(MessageMusicResponse musicMessage) {        
    		xstream.alias("xml", musicMessage.getClass());        
    		return xstream.toXML(musicMessage);    
    	}
    	/**
    	 * 图文消息对象转换成XML
    	 * @param newsMessage
    	 * @return
    	 */
    	public static String messageToXml(MessageNewsResponse newsMessage) {        
    		xstream.alias("xml", newsMessage.getClass());        
    		xstream.alias("item", new Article().getClass());        
    		return xstream.toXML(newsMessage);    
    	}
    }
    

    以上代码用到了dom4j,所以还要在项目中引入dom4j的jar包。

    最后把class文件提交到百度BAE中,发布,重启,这时候在客户端输入任何文本内容都会收到服务器的自动回复。

    展开全文
  • 查看Fiddler响应消息乱码解决办法

    万次阅读 2018-08-24 14:52:47
    Fiddler响应消息乱码解决办法 ** 查看响应消息TextView区域和SyntaxView区域会出现乱码,有两种解决办法: 1.可以直接点下方黄色区域解码 2.可以选中上方快捷菜单decode 两者之间的区别: 1、直接点击黄色区域...
  • 目前动态创建控件可以实现,但是控件却不响应消息,我认为是消息只在Dialog中,没法传到其成员变量中,不知道是不是这个原因……请大神帮忙! 我做了一个很简单的程序,请大神帮忙分析一下,灰常灰常感谢~
  • C++Builder如何响应消息及自定义消息

    千次阅读 2011-12-03 05:30:16
    C++Builder如何响应消息及自定义消息    Inprise(Borland) C++Builder中,可以象在Delphi中一样响应消息,只是看起来要稍 复杂一点。    对于系统已定义的消息,可以直接响应:   #define WM_MY_OPEN...
  • HTTP响应消息

    千次阅读 2019-10-06 16:51:37
      ...1.请求消息:客户端给服务器端的数据           ※数据格式           &n...
  • 文章目录一、响应响应状态码二、响应头三、响应空行四、响应体 HTTP/1.1 200 OK Bdpagetype: 1 Bdqid: 0x87b0208600091dd6 Cache-Control: private Connection: keep-alive Content-Encoding: gzip Content-Type:...
  • servlet中response响应消息的状态码简述 状态码定义: ​ 服务器用于告诉客户端浏览器本次请求和响应的状态且状态码都是十进制三位数 状态码分类: ​ 状态码共分5类.第一类是以1开头的三位数字,以此类推.且每一类的...
  • 缩写 注解 HDN Header Notify LVN ListView control Notify ...响应消息 解析 HDN_BEGINTRACK 开始拖动控件顶部的分割线 HDN_BEGINDRAG 开始拖动控件顶部的分栏(item) HDN_BE...
  • * 响应字符串格式 HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 Content-Length: 101 Date: Wed, 06 Jun 2018 07:08:42 GMT <html> <head> <title>$Title$</title...
  • MFC键盘响应消息

    千次阅读 2012-12-31 13:49:08
    MFC 键盘响应 一:首先介绍键盘消息 系统消息: ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。 WM_SYSKEYDOWN WM_SYSKEYUP WM_SYSCHAR 非系统消息: 是由我们自己加上去的, ...
  • //响应 String result="登录成功,欢迎你"; ServletOutputStream outputStream = resp.getOutputStream(); outputStream.write(result.getBytes()); } } 访问浏览器: 表单输入用户名、密码: 运行...
  • HTTP请求消息和响应消息的数据格式

    千次阅读 2020-02-04 09:24:04
    概念 ... Hyper Text Transfer Protocol 超文本...基于请求/响应模型 :一次请求对应一次响应 无状态的:每次请求之间相互独立,不能交互数据 历史版本 HTTP 1.0:每一次请求响应都会建立新的连接,浪费时间,消耗...
  • MFC 分割窗口 无法响应消息

    千次阅读 2010-08-28 15:57:00
    在MFC程序中,如果在主框架下有多个视图,并且分别响应不同消息, 当单击其中一个视图是,其他视图无法响应消息,表现为菜单、工具条灰化,解决方案    CMainFrame* pFrame = (CMainFrame*) ...
  • <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency>...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 562,572
精华内容 225,028
关键字:

响应消息