有时使用一些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。
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
}
要结合使用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()
}
因此,我们的请求部分:
- 选择重新类型
- URL字段
- 发送按钮发送请求
响应:
- 显示响应主体的文本区域
- 单击时显示其他数据的标题和状态按钮
运行应用程序: