XMPP中的Stanza ID的目的是什么?

时间:2019-01-17 07:51:11

标签: xml xmpp

有人可以解释ID在某些XMPP XML请求中的作用(谈论核心XMPP)吗?

例如,我可以通过发送以下请求来获取名单:

public Array GetTotalResearchByArea()
{
    var list = new List<int>();
    var all_area = context.Areas.Select(x => x.Id ).ToList();

    foreach( var item in all_area)
    {
        var allReserachCategory = context.ResearchCategories.Where(a => a.AreaId == item).Select(a => a.Id).ToList();
        var totalResearchBySingleArea = context.Researchs.Where(c => allReserachCategory.Contains(c.ResearchCategoryId)).Count();
        list.Add(totalResearchBySingleArea);
    }
    return list.ToArray();
}

但是我也可以通过添加一个随机ID来获取它:

<iq type="get">
    <query xmlns="jabber:iq:roster"></query>
</iq>

我是否应该使用ID是否有理由?与安全相关吗?有什么缺点吗?关于ID的约定是什么,应该如何构造它们?

2 个答案:

答案 0 :(得分:2)

当您发送带有 type =“ get” type =“ set” 的IQ时,您将收到带有 type =“ result” < / strong>和相同的ID

所以这只是为了按照ID将响应与他们的请求进行匹配。

例如

获得花名册:

ajaxError()

响应:

def text = "Going to convert this to Base64 encoding!"

def encoded = text.bytes.encodeBase64().toString()
println encoded

byte[] decoded = encoded.decodeBase64()
println new String(decoded)

它们包含相同的ID,因此您知道此响应是针对哪个请求

答案 1 :(得分:2)

我建议您简单地研究一下协议规范。 RFC 6120 § 8.1.3. id很好地解释了恕我直言:

  

始发实体使用'id'属性来跟踪任何
  与
有关的响应或错误节   从另一个实体(例如中间服务器)生成的节
  或预期的收件人。

     

'id'的值取决于原始实体
  属性仅在其当前流中是唯一的或唯一的
  

     

对于节,推荐用于
  原始实体包括“ id”属性;对于节,
  这是必需的。

     

如果生成的节包含'id'属性,则为
  响应或错误节还必须包含一个“ id”
  属性,其中'id'属性的值必须与
  生成的节。

并非您的示例显示的IQ节没有设置“ id”属性实际上是无效