Akka-http HTTPS возвращение вызова 403 - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь сделать этот звонок

curl -X POST \
 'https://structuredproducts-ch.leonteq.com/engine- 
 api/feed/timeseries/request?from=201805310000&to=201805311602' \
 -H 'accept: application/json' \
 -H 'content-type: application/json' \
 -d '{  "sophisInternalIds": [    67108959  ]}'

и работает нормально локально через почтальона или локон, но с помощью akka-http не могу дозвониться.

Попытался принять вручнуюкаждая проверка имени хоста SSL, но это также не помогает.Всегда получаю 403 Запрещено.

Когда я попробовал некоторые другие трюки, я в конечном итоге получил проблему с SSLEngine, которая снова ни к чему не приводит.

private val trustfulSslContext: SSLContext = {

   object NoCheckX509TrustManager extends X509TrustManager {
     override def checkClientTrusted(chain: Array[X509Certificate], authType: String): Unit = ()

     override def checkServerTrusted(chain: Array[X509Certificate], authType: String): Unit = ()

     override def getAcceptedIssuers: Array[X509Certificate] = Array[X509Certificate]()
   }

   val context = SSLContext.getInstance("TLS")
   context.init(Array[KeyManager](), Array(NoCheckX509TrustManager), null)
   context
}


  Http(context.system)
    .singleRequest(
      HttpRequest(
       uri = Uri(url), 
       method = HttpMethods.POST, 
       entity = "lala", 
       protocol = HttpProtocols.`HTTP/1.1`),
      connectionContext = ConnectionContext.https(trustfulSslContext)
    )

Я использую akka-http 10.1.0.

1 Ответ

0 голосов
/ 12 июня 2018

Оказывается, вам нужно передать правильный Content-Type заголовок и данные.Я думаю, это зависит от того, как это реализовано на этом сервере.Итак, приведенный ниже код работает:

val requestEntity: RequestEntity = HttpEntity.Strict(
    contentType = ContentTypes.`application/json`,
    data = ByteString("{  \"sophisInternalIds\": [    67108959  ]}")
)

Http(context.system)
    .singleRequest(
    HttpRequest(
        uri = Uri("https://structuredproducts-ch.leonteq.com/engine-api/feed/timeseries/request?from=201805310000&to=201805311602"),
        method = HttpMethods.POST,
        entity = requestEntity,
        protocol = HttpProtocols.`HTTP/1.1`
    )
)
...