XEP-0055 的错误 400 错误请求?

Posted

技术标签:

【中文标题】XEP-0055 的错误 400 错误请求?【英文标题】:error 400 bad request with XEP-0055? 【发布时间】:2014-11-07 14:28:26 【问题描述】:

我从我的服务器获得了可能的字段:

<iq xmlns="jabber:client" from="vjud.company.com" to="testuser@company.com/iPhone" id="search1" type="result"><query xmlns="jabber:iq:search">

<instructions>You need an x:data capable client to search</instructions>
<x xmlns="jabber:x:data" type="form">
<title>Search users in vjud.company.com</title>
<instructions>Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)
</instructions>
<field type="text-single" label="User" var="user"/>
<field type="text-single" label="Full Name" var="fn"/>
<field type="text-single" label="Name" var="first"/>
<field type="text-single" label="Middle Name" var="middle"/>
<field type="text-single" label="Family Name" var="last"/>
<field type="text-single" label="Nickname" var="nick"/>
<field type="text-single" label="Birthday" var="bday"/>
<field type="text-single" label="Country" var="ctry"/>
<field type="text-single" label="City" var="locality"/>
<field type="text-single" label="Email" var="email"/>
<field type="text-single" label="Organization Name" var="orgname"/>
<field type="text-single" label="Organization Unit" var="orgunit"/>
</x>
</query>
</iq>

假设我想搜索具有 JID admin@company.com 的用户

组合的请求将如下所示:

XMPPIQ *iq2 = [[XMPPIQ alloc] init];
[iq2 addAttributeWithName:@"type" stringValue:@"set"];
[iq2 addAttributeWithName:@"from" stringValue:@"testuser@company.com"];
[iq2 addAttributeWithName:@"to" stringValue:@"vjud.company.com"];
[iq2 addAttributeWithName:@"id" stringValue:@"search1"];
XMPPElement *query2 = [XMPPElement elementWithName:@"query"];
[query2 setXmlns:@"jabber:iq:search"];
XMPPElement *user = [XMPPElement elementWithName:@"user"];
[user setStringValue:@"admin"];
[iq2 addChild:query2];
[query addChild:user];

错误节:

<iq xmlns="jabber:client" from="vjud.company.com" to="testuser@company.com/iPhone" type="error" id="search1">
<query xmlns="jabber:iq:search"/>
<error code="400" type="modify">
<bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
</error>
</iq>

所以,基本上有2个问题:

    为什么没有&lt;/query&gt; 元素作为响应? 是错误的真正原因吗?

-服务器的响应应该是这样的-

非常感谢@legoscia 用户,如果请求是正确的,你会得到这样的东西(通知&lt;item&gt; 元素):

   <iq xmlns="jabber:client" from="vjud.company.com" to="testuser@company.com/iPhone" id="search1" type="result»>

 <query xmlns="jabber:iq:search"><x xmlns="jabber:x:data" type="result»>
 <title>Search Results for vjud.company.com</title>
 <reported>
 <field type="text-single" label="Jabber ID" var="jid»/>
 <field type="text-single" label="Full Name" var="fn»/>
 <field type="text-single" label="Name" var="first»/>
 <field type="text-single" label="Middle Name" var="middle»/>
 <field type="text-single" label="Family Name" var="last"/><field type="text-single" label="Nickname" var="nick»/>
 <field type="text-single" label="Birthday" var="bday»/>
 <field type="text-single" label="Country" var="ctry»/>
 <field type="text-single" label="City" var="locality»/>
 <field type="text-single" label="Email" var="email»/>
 <field type="text-single" label="Organization Name" var="orgname"/><field type="text-single" label="Organization Unit" var="orgunit»/>
 </reported>
 <item>
 <field var="jid»>
 <value>admin@company.com</value>
 </field>
 <field var="fn"><value/></field>
 <field var="last"><value/></field>
 <field var="first"><value/></field>
 <field var="middle"><value/></field>
 <field var="nick"><value/></field>
 <field var="bday"><value/></field>
 <field var="ctry"><value/></field>
 <field var="locality"><value/></field>
 <field var="email"><value/></field>
 <field var="orgname"><value/></field>
 <field var="orgunit"><value/></field></item>
 </x>
 </query>
 </iq>

如果没有匹配项,您只会收到包含大量字段的&lt;reported&gt; 元素。您可能还想看看this。

【问题讨论】:

【参考方案1】:

此搜索服务不支持“普通”XEP-0055 搜索字段,但要求您提交“get”请求响应中返回的x:data 表单;见XEP-0004。

您可以通过结果不包含任何建议的搜索字段作为查询元素的子项这一事实来判断这一点(参见 XEP-0055 的示例 2),&lt;instructions/&gt; 元素也是如此。这意味着您需要查看&lt;x xmlns="jabber:x:data" type="form"&gt; 元素并提交它。

因此,您需要发送如下内容:

<iq type='set'
    from='juliet@capulet.com/balcony'
    to='characters.shakespeare.lit'
    id='search4'
    xml:lang='en'>
  <query xmlns='jabber:iq:search'>
    <x xmlns='jabber:x:data' type='submit'>
      <field var='user'>
        <value>admin</value>
      </field>
    </x>
  </query>
</iq>

(这是来自 XEP-0055 的示例 8,已修改为搜索用户名为“admin”的用户。)

【讨论】:

谢谢!我会在 10 分钟内尝试并回复。顺便问一下,这个“隐藏”类型是什么意思? 过度复制粘贴 :) 服务器可以发送 FORM_TYPE 字段以表明它遵循搜索字段含义的特定标准,并且客户端应该镜像它,但现在我看到了它不以服务器提供的形式存在,因此没有理由包含它。更新了答案。 好的,我知道了。我稍后会尝试,但再次非常感谢你!没有人可以回答以前和当前的问题。 所以我试过了,但我只能获取管理价值。如果我放置其他注册用户,例如 testuser2 我什么也得不到(没有 元素,只有 元素)。 对此有什么想法吗?

以上是关于XEP-0055 的错误 400 错误请求?的主要内容,如果未能解决你的问题,请参考以下文章

XEP - 0055 与 iOS 和 ejabberd?

XEP 0055(Jabber 搜索)与 iphone SDK

XMPP - iphone sdk 中的用户搜索?在 iphone sdk 中使用 XEP-0055?

HTTP 400 - 错误请求

HTTP 400 错误

get请求400错误,post请求405错误