• RhinoFC © (21.12.18 13:20) [0]
    Здравствуйте.

    Подскажите, как работать с WebSocket'ами в Дельфи?

    Нужно открыть канал на стороне клиента, подключиться к хосту, авторизоваться и слушать сообщения от него.

    Информации в инете о работе с вэб-сокетами фактически нет (ну, есть, но это всё "шляпа" какая-то).
    Компонентов тоже. Скачал какую-то опенсорсную библиотеку (https://github.com/andremussche/DelphiWebsockets), но ничего добиться с её помощью не могу.
    Делаю так:
     client := TIdHTTPWebsocketClient.Create(Self);
     client.Port := 12346;
     client.Host := 'https://app.relay.crisp.chat/';
     client.Connect;
     client.UpgradeToWebsocket;

    В итоге ошибка "Host not found". И вот не могу понять, что не так делаю.
    Я в этой теме совершенно не разбираюсь и разобраться не получается (в виду отсутствия информации).
    Помогите кто-нибудь.
  • ws (21.12.18 13:48) [1]
    в хосте у тебя не хост а ури.

    хост это app.relay.crisp.chat
  • rhinofc © (21.12.18 14:11) [2]
    Всё равно ошибка. На этот раз Connect timed out. :(
  • rhinofc © (21.12.18 14:32) [3]
    Точнее сперва выдаёт
    Socket Error # 10038 Socket operation on non-socket
    А затем уже Connect timed out
  • ws (21.12.18 14:38) [4]
    на этом хосте на порту 12346 никто никого не ждет
  • rhinofc © (21.12.18 15:10) [5]
    А какой порт использовать? В документации REST-API Crisp'a нет ни слова об этом
  • ws (21.12.18 15:20) [6]
    с какого такого праздника REST'у, который по конституции всегда был stateless
    вдруг потребовалось работать через вебсокеты, протокол с постоянным соединением?
  • rhinofc © (21.12.18 15:26) [7]
    Выдержка из документации (https://docs.crisp.chat/api/v1/#header-🔀-rtm-events):

    RTM Events ¶
    The REST API comes along with a RTM Events API. RTM Events are sent on a WebSocket channel that you can open alongside your REST API channel, which allows you to receive asynchronous replies and events for some of your actions via the REST API.

    You may subscribe to events by opening a Socket.IO connection to the WebSocket endpoint: https://app.relay.crisp.chat/
  • ws (21.12.18 15:45) [8]
    в эту документацию рыбу заворачивали.

    заходим в Libraries, выбираем любое и смотрим внутрь.
    и видим что все работает на обычном http/https
    и никаких вебсокетов там нет и в помине
  • ws (21.12.18 15:50) [9]
    вот например пистоновский клиент

    import json          

    /* вот он http/https транспорт */
    from requests import request              

    /* вот она бэйсик аус */
    from requests.auth import HTTPBasicAuth

    from .errors.route import RouteError
    from .resources.bucket import BucketResource
    from .resources.user import UserResource
    from .resources.website import WebsiteResource

    class Crisp(object):
     /* вот тебе обычные http заголовки */
     REQUEST_HEADERS = {
       "User-Agent": "python-crisp-api/1.1.0",
       "Content-Type": "application/json"
     }

     def __init__(self):
       self.__auth = {}

       self.__rest_host = None
       self.__rest_base_path = None
       self.__timeout = None

       self.bucket = BucketResource(self)
       self.user = UserResource(self)
       self.website = WebsiteResource(self)

     def authenticate(self, identifier, key):
       self.__auth["identifier"] = identifier
       self.__auth["key"] = key

    /* вот он ури для апи. и он ни разу не wss:// а https:// */
     def get_rest_host(self):
       return self.__rest_host or "https://api.crisp.chat"
  • rhinofc © (21.12.18 17:03) [10]
    Да нет. Есть сокеты.
    Вот здесь
    https://github.com/crisp-im/go-crisp-api/blob/master/crisp/events.go
  • ws (21.12.18 17:22) [11]
    The REST API comes along with a RTM Events API.

    Два апи.

    чат работает на рест по https.
    чат не работает через вебсокеты.

    вебсокетное апи - доп пришлепка сбоку к рест апи, для получения нотификаций о событиях. Чтобы не долбить постоянно сервер рест-запросами "а нет ли чего новенького?"

    Сарайка строится начиная со стен. затем на них нахлобучивают крышу.
    А не наоборот. Сначала крышу, под которую подпихивают стены.
  • rhinofc © (21.12.18 17:26) [12]
    Ну правильно. Мне как раз это и надо.
    Я как раз и хочу на события подписаться.
    C REST API у меня проблем нет. Проблема именно в событиях RTM.
  • rhinofc © (21.12.18 17:28) [13]
    Смотрю их исходники:

    func (service *EventsService) getEndpointURL() (string) {
     var secure bool

     u, _ := url.Parse(service.client.config.RealtimeEndpointURL)
     host, portString, _ := net.SplitHostPort(u.Host)

     port, _ := strconv.ParseInt(portString, 10, 64)

     if u.Scheme == "https" {
       secure = true
     }
    else {
       secure = false
     }


     return gosocketio.GetUrl(host, int(port), secure)
    }




    Хрен пойми, откуда они порт берут.
  • ws (21.12.18 17:43) [14]
    сплит строки на хост и порт. по двоеточию.
    затем strtoint порту

    высшая математика, уровень прокачанного доктора наук, акамедика
  • Styx © (21.12.18 21:29) [15]
    По умолчанию https слушает на порту 443
Есть новые Нет новых   [118239   +19][b:0][p:0.001]