2014-11-07 5 views
1

я получил возможные поля с моего сервера:ошибка 400 плохой запрос с XEP-0055?

<iq xmlns="jabber:client" from="vjud.company.com" to="[email protected]/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 [email protected]

Состоит запрос Виль выглядеть следующим образом:

XMPPIQ *iq2 = [[XMPPIQ alloc] init]; 
[iq2 addAttributeWithName:@"type" stringValue:@"set"]; 
[iq2 addAttributeWithName:@"from" stringValue:@"[email protected]"]; 
[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="[email protected]/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> 

Итак, в основном t вот 2 вопроса:

  1. Почему нет </query> элементов в ответе?
  2. Это фактическая причина ошибки?

ответ -Сервера должен выглядеть this-

Больших благодаря пользователю @legoscia в запрос случая был составлен правильно, вы получите что-то вроде этого (уведомление <item> элемента):

<iq xmlns="jabber:client" from="vjud.company.com" to="[email protected]/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>[email protected]</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> 

Если совпадений нет, вы получите только <reported> элемент с большим количеством полей. Возможно, вы захотите посмотреть и на this.

ответ

1

Эта поисковая служба не поддерживает поля поиска "plain" XEP-0055, но вам необходимо отправить форму x:data, указанную в ответе на запрос "получить"; см. XEP-0004.

Об этом можно узнать из-за того, что результат не содержит каких-либо предлагаемых полей поиска в виде дочерних элементов элемента запроса (см. Пример 2 из XEP-0055), а также элемент <instructions/>. Это означает, что вам нужно посмотреть на элемент <x xmlns="jabber:x:data" type="form"> и отправить его.

Таким образом, вам нужно отправить что-то вроде:

<iq type='set' 
    from='[email protected]/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> 

(Это пример 8 из XEP-0055, модифицированный для поиска пользователя с именем пользователя "администратора".)

+0

Спасибо! Я попробую это через 10 минут и отвечу. Кстати, что означает этот «скрытый» тип? – efimovdk

+0

Чрезмерное копирование: сервер может отправить поле FORM_TYPE, чтобы указать, что он соответствует определенному стандарту, для которого означают поля поиска, и клиент должен отражать его, но теперь я вижу, что его нет в представленной форме сервером, поэтому нет причин включать его. Обновленный ответ. – legoscia

+0

Хорошо, я тебя достал. Я попробую это позже, но спасибо вам очень много! Никто не мог ответить на предыдущие и текущие вопросы. – efimovdk

Смежные вопросы