如何强制 okhttp 对请求使用 http/2?

Rob*_*nho 5 okhttp http2

我想发出一个请求并强制它使用 Protocol.HTTP_2。我试过下面的代码:

import okhttp3.{OkHttpClient, Protocol, Request}

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer

object Main2 extends App {
  val url = "https://google.com/"
  val client = new OkHttpClient.Builder().protocols(ListBuffer(Protocol.HTTP_2)).build()
  val request = new Request.Builder().url(url).build()
  val response = client.newCall(request).execute()
  println(response.body().string())
}
Run Code Online (Sandbox Code Playgroud)

但是出现错误:线程“main”中的异常java.lang.IllegalArgumentException:协议不包含http/1.1:[h2]

Jes*_*son 7

如果 \xe2\x80\x99s 可用,OkHttp 将自动使用 HTTP/2,但你可以 \xe2\x80\x99t 禁用 HTTP/1.1。

\n

  • 如果我的服务器复用 HTTP/1.1 和 HTTP/2,它似乎不起作用 (2认同)

小智 5

如果您没有使用 SSL/TLS,则可以Protocol.H2_PRIOR_KNOWLEDGEProtocol.HTTP_2创建 OkHttpClient 时使用它。

这将发送一个明文 HTTP/2,它不会首先与服务协商使用哪个协议。

对我来说,当服务器复用 HTTP/1.1 和 HTTP/2 时,这会强制使用 HTTP/2。

来源:https ://square.github.io/okhttp/3.x/okhttp/okhttp3/Protocol.html#H2_PRIOR_KNOWLEDGE