Использование Finagle Http-клиента для запросов https
Я пытаюсь получить данные из веб-службы REST. Пока я могу получить данные правильно, если я не использую HTTPS с этим кодом, работающим как ожидалось -
val client = Http.client.newService(s"$host:80")
val r = http.Request(http.Method.Post, "/api/search/")
r.host(host)
r.content = queryBuf
r.headerMap.add(Fields.ContentLength, queryBuf.length.toString)
r.headerMap.add("Content-Type", "application/json;charset=UTF-8")
val response: Future[http.Response] = client(r)
Но когда я пытаюсь получить те же данные из запроса https (по этой ссылке)
val client = Http.client.withTls(host).newService(s"$host:443")
val r = http.Request(http.Method.Post, "/api/search/")
r.headerMap.add("Cookie", s"_elfowl=${authToken.elfowlToken}; dc=$dc")
r.host(host)
r.content = queryBuf
r.headerMap.add(Fields.ContentLength, queryBuf.length.toString)
r.headerMap.add("Content-Type", "application/json;charset=UTF-8")
r.headerMap.add("User-Agent", authToken.userAgent)
val response: Future[http.Response] = client(r)
Я получаю ошибку
Remote Info: Not Available at remote address: searchservice.com/10.59.201.29:443. Remote Info: Not Available, flags=0x08
Я могу свернуть ту же самую конечную точку с портом 443, и он возвращает правильный результат. Может кто-нибудь, пожалуйста, помогите мне решить проблему?
1 ответ
Несколько вещей, чтобы проверить:
withTls(host)
должно быть именем хоста, указанным в сертификате сервера (в отличие от ip, например)
ты можешь попробовать:
Http.client.withTlsWithoutValidation
чтобы проверить выше.
Также вы можете захотеть проверить, проверяет ли сервер, что установлен заголовок хоста, и если да, вы можете включить его:
val withHeader = new SimpleFilter[http.Request, http.Response] {
override def apply(request: http.Request, service: HttpService): Future[http.Response] = {
request.host_=(host)
service(request)
}
}
withHeader.andThen(client)
больше информации о заголовке узла: Что такое заголовок узла http?