Spring boot spring在kotlin中的应用

Spring boot spring在kotlin中的应用,spring-boot,kotlin,retrofit2,Spring Boot,Kotlin,Retrofit2,我是Spring+Kotlin的新手,正在尝试编写一个简单的服务器。我正在尝试编写一个可执行示例代码,其中一个应用程序服务器接收来自客户端的请求,并将请求发送到另一个服务器,该服务器将返回结果,而应用程序服务器将向客户端返回该结果 我将服务器绑定到localhost:9000上,当我将请求发送到localhost:9000/music?user=which,我首先得到了一个预期结果,如下所示 [ "Music(Genre=Rock, Mood=[Joyful, Depressed])"

我是Spring+Kotlin的新手,正在尝试编写一个简单的服务器。我正在尝试编写一个可执行示例代码,其中一个应用程序服务器接收来自客户端的请求,并将请求发送到另一个服务器,该服务器将返回结果,而应用程序服务器将向客户端返回该结果

我将服务器绑定到localhost:9000上,当我将请求发送到
localhost:9000/music?user=which
,我首先得到了一个预期结果,如下所示

[
    "Music(Genre=Rock, Mood=[Joyful, Depressed])"
]
package org.whatever

import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST

interface MusicService {
    @Headers("accept: application/json",
            "content-type: application/json")
    @POST("/")
    fun genreMoodRequest(@Body params: Amplitudes)
        : Call<Music>

    companion object {
        fun create(): MusicService {
            val retrofit = Retrofit.Builder()
                    .baseUrl("http://localhost:5000")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()

            return retrofit.create(MusicService::class.java)
        }
    }
}
然而,再次发送相同的请求(使用邮递员),我得到了
[]
作为回报。我无法理解这种行为,因为我希望每次发送请求时都返回相同的结果。样本输入在控制器代码中硬编码,作为名为sampleList的变量。我的目标是在解决此问题后,通过从客户机接收此变量作为请求体来更改此部分

有人能解释为什么会出现这种意想不到的行为吗? 非常感谢。代码如下所示

package org.whatever

import org.springframework.web.bind.annotation.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

@RestController
class MusicController {

    @GetMapping("/music")
    fun retrieveMusicInfo(@RequestParam(value = "user") user: String): MutableList<String> {
        val valList = mutableListOf<String>()

        val sampleList: List<Int> = listOf(1, 2, 3, 4)
        val sampleAmplitudes = Amplitudes(sampleList)
        MusicService.create()?.genreMoodRequest(sampleAmplitudes).enqueue(object : Callback<Music> {
            override fun onFailure(call: Call<Music>, t: Throwable) { // Whatever }
            override fun onResponse(call: Call<Music>, response: Response<Music>?) {
                val data = response?.body()?.toString()
                data?.let { valList.add(it) }
            }
        })
        return valList
    }
}
package org.whatever
导入org.springframework.web.bind.annotation*
2.致电
导入2.回调
2.回应
@RestController
类音乐控制器{
@GetMapping(“/music”)
乐趣检索音乐信息(@RequestParam(value=“user”)用户:字符串):可变列表{
val valList=mutableListOf()
val sampleList:List=listOf(1,2,3,4)
val sampleAmplitudes=振幅(样本列表)
MusicService.create()?.genreMoodRequest(SampleAmplications).enqueue(对象:回调){
override-fun-onFailure(call:call,t:Throwable){//Whatever}
覆盖fun onResponse(调用:调用,响应:响应?){
val数据=响应?.body()?.toString()的值
数据?让{valList.add(it)}
}
})
返回值列表
}
}
服务逻辑如下所示

[
    "Music(Genre=Rock, Mood=[Joyful, Depressed])"
]
package org.whatever

import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST

interface MusicService {
    @Headers("accept: application/json",
            "content-type: application/json")
    @POST("/")
    fun genreMoodRequest(@Body params: Amplitudes)
        : Call<Music>

    companion object {
        fun create(): MusicService {
            val retrofit = Retrofit.Builder()
                    .baseUrl("http://localhost:5000")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()

            return retrofit.create(MusicService::class.java)
        }
    }
}
package org.whatever
2.致电
进口改装2.改装
导入改装2.converter.gson.GsonConverterFactory
导入文件2.http.Body
导入2.http.Headers
导入文件2.http.POST
接口音乐服务{
@标题(“接受:应用程序/json”,
“内容类型:应用程序/json”)
@职位(“/”)
fun genreMoodRequest(@Body参数:振幅)
:呼叫
伴星{
乐趣创建():音乐服务{
val reformation=reformation.Builder()
.baseUrl(“http://localhost:5000")
.addConverterFactory(GsonConverterFactory.create())
.build()
return reformation.create(MusicService::class.java)
}
}
}
问题 改装
enqueue()
正在异步工作。所以它不会阻塞处理请求的Spring线程

因此,请求的线程可以在从改造客户端接收响应之前完成

解决 1) 使用弹簧
RestTemplate
代替改装


2) 使用阻塞API进行改装(而不是
enqueue()

这可能有点像accept头不是通过邮递员发送的。是来自浏览器的第一个请求吗?@stringy05不,不是。工作请求来自邮递员,下面的(不工作并返回空字符串)请求也是来自邮递员。这很奇怪。不确定这是否有帮助,但如果您从工作请求和失败请求中添加请求和响应头,可能会有一些细节