<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_items_by_id(self, jid, node, ids):
 """ Request specific items by their IDs from a node. :param jid: Address of the PubSub service. :type jid: :class:`aioxmpp.JID` :param node: Name of the PubSub node to query. :type node: :class:`str` :param ids: The item IDs to return. :type ids: :class:`~collections.abc.Iterable` of :class:`str` :raises aioxmpp.errors.XMPPError: as returned by the service :return: The response from the service :rtype: :class:`.xso.Request` `ids` must be an iterable of :class:`str` of the IDs of the items to request from the pubsub node. If the iterable is empty, :class:`ValueError` is raised (as otherwise, the request would be identical to calling :meth:`get_items` without `max_items`). Return the :class:`.xso.Request` object, which has a :class:`~.xso.Items` :attr:`~.xso.Request.payload`. """


        iq = aioxmpp.stanza.IQ(to=jid, type_=aioxmpp.structs.IQType.GET)
        iq.payload = pubsub_xso.Request(
            pubsub_xso.Items(node)
        )

        iq.payload.payload.items = [
            pubsub_xso.Item(id_)
            for id_ in ids
        ]

        if not iq.payload.payload.items:
            raise ValueError("ids must not be empty")

        return (yield from self.client.send(iq))