HTTP客户量UI与Kotlin和Javafx
#java #kotlin #gradle #ui

有时使用一些UI执行HTTP请求,而不仅仅是CLI工具,这可能是有用的。 OD课程,有一些工具,例如PostAmn或失眠症,它们很棒,但是拥有一些非常简单的UI来执行此操作并测试一些简单的Thinsg是一件好事:)

github上的代码:https://github.com/ahndmal/http-client-ktl-jfx

我们将使用kotlin(https://kotlinlang.org)和openjfx(https://openjfx.io)和gradle来构建该应用程序(尽管Javac / kotlinc可以足够)。< / p>

我们添加“ org.openjfx.javafxplugin” gradle插件到build.gradle.kts并添加基本配置:

plugins {
    kotlin("jvm") version "1.9.0"
    application
    **id("org.openjfx.javafxplugin") version "0.0.13"**
}

javafx {
    setVersion("20")
    setModules(listOf("javafx.controls"))
}

group = "com.andmal"
version = "0.0.2"

repositories {
    mavenCentral()
}

kotlin {
    jvmToolchain(20)
}

application {
    mainClass.set("Main")
}

另外,我们创建 main.kt 文件以添加基本逻辑以使用Javafx库来启动UI。

JavaFX UI elements structure

class Main : Application() {
    override fun start(primaryStage: Stage?) {
        val scene = Scene(createContent(), 1200.0, 900.0)
        primaryStage?.title = "HTTP Client"
        primaryStage?.scene = scene
        primaryStage?.show()
    }
}

main 类扩展 javafx.application.application.application ,并实现了 start 方法来启动UI。我们将 createContent()方法添加为启动方法的参数,并将基本逻辑添加到它:

private fun createContent(): Parent {
   // todo
}

Basic UI window

要结合使用UI,我们可以使用基本的VBox / hbox类来垂直和层次对齐Elemtns以及GridPane通过行和列映射项目。< / p>

我们添加了基本的UI元素:

val mainBox = VBox()
val requestBox = VBox()
val reqPane = GridPane()
val reqBody = TextArea()

// response 
val responsePane = GridPane()
val responseBox = VBox()
val urlLabel = Label("URL")
urlField = TextField()

添加一些填充和背景:

mainBox.padding = Insets(10.0)
requestBox.border = Border.stroke(Paint.valueOf("orange"))
HBox.setMargin(requestBox, Insets(10.0))
reqBody.minWidth = 500.0
reqBody.minHeight = 200.0

然后,我们在核心元素中添加按钮,标头:

reqPane.add(methodType, 0, 2)
reqPane.add(urlField, 1, 2)
reqPane.add(reqButton, 2, 2)
reqPane.add(reqHeaderButton, 2, 3)

requestBox.children.add(reqPane)
responseBox.children.add(responsePane)

mainBox.children.addAll(
    requestBox, responseBox
)

将侦听器添加到按钮中以对单击的反应:

reqButton.setOnMouseClicked { event ->
     if (urlField.length == 0) {
           infoHeader.text = "Error: please fill in URL"
           infoHeader.background = Background.fill(Paint.valueOf("red"))
           infoHeader.textFill = Paint.valueOf("white")
           infoHeader.font = Font.font(17.0)
           responsePane.add(infoHeader, 0, 0)
            } else {
                // correct request data
             responseBox.children.removeAll()
     }
}

另外,我们添加“保存文件”按钮以将响应保存为文件:

saveAsFileBtn.setOnMouseClicked {
    val file = 
Files.createFile(Path.of("./response_${Instant.now().epochSecond}"))
                    file.writeBytes(httpResponse.body().toByteArray())
}

我们使用java.net.http.client(自Java v.11起)作为简单和基本的HTTP客户端:

// HTTP client
val client = HttpClient.newBuilder()
      .version(HttpClient.Version.HTTP_1_1).build()

// request
val req = HttpRequest.newBuilder()
   .uri(URI.create(urlField.text))

使用帖子或放置方法时,我们希望有一些文本字段:

methodType.setOnAction {
    when (methodType.value.first) {
       "GET" -> reqPane.children.remove(reqBody)
       "POST" ->  reqPane.add(reqBody, 1, 3)
       "PUT" ->  reqPane.add(reqBody, 1, 3)
    }
}

根据我们选择的http方法,完成http请求的完整http请求:

when(methodType.value.second) {
   "GET" -> req.GET()
   "POST" -> req.POST(BodyPublishers.ofString(reqBody.text))
   "PUT" -> req.PUT(BodyPublishers.ofString(reqBody.text))
   "DELETE" -> req.DELETE()
}

因此,我们的请求部分:

  1. 选择重新类型
  2. URL字段
  3. 发送按钮发送请求

响应:

  1. 显示响应主体的文本区域
  2. 单击时显示其他数据的标题和状态按钮

运行应用程序:

Complete UI