Wpis z mikrobloga

U czu może chodzić se, bo jusz mi nawet chat gpt się zapętlił na tym problemie?

3 screeny są, Kotlin + Groovy + Spring.
1. RestController

@RestController
@RequestMapping("/search")
class SearchApi(
private val searchService: SearchService
){

@PostMapping
suspend fun postSearch(
@RequestHeader("Authorization") authorization: String,
@RequestBody request: PostSearchRequestDto
): ResponseEntity<SearchDto> {
return searchService.startSearch(authorization, request)
.let { ResponseEntity.ok(it) }
}
}

2. Strzelam do endpointa z tego controllera za pomocą TestRestTemplate

restTemplate.postForEntity("http://localhost:$port/search", request1, String.class)
3. Request wygląda tak

def headers1 = createMultiValueMap(["Authorization": user1.id, "Content-Type": MediaType.APPLICATION_JSON_VALUE]) as MultiValueMap<String, String>
def request1 = new HttpEntity<>(requestBody1, headers1)

Dostaję 415:

"status":415,"error":"Unsupported Media Type","path":"/search"},[Transfer-Encoding:"chunked", Accept:"application/json, application/cbor, application/*+json"


Tymczasem strzał curlem działa se:

curl localhost:8080/search?id=1 -H "Authorization:1"
#programowanie #kotlin #java
aczutuse - U czu może chodzić se, bo jusz mi nawet chat gpt się zapętlił na tym probl...

źródło: gpt wysiadl

Pobierz
  • 15
@aczutuse: a co to za kiepska praktyka? Czemu zwykły endpoint ma obsługiwać token autoryzacyjny?

powinieneś tam mieć jakiś HttpRequest servlet filter/listener (nie pamiętam jak się nazywało) przed requestem w osobnej warstwie i ustawiać SecurityContext. Zwykły controller powinien sobie stukać tylko do serwisu autoryzacyjnego, który przekazuje dane kto jest autorem (dane z tokenu)
  • 0
@nad__czlowiek: prototypuję se, ten authorization to na razie jest id uzytkownika, potem bedem wlasnie tak robil, ze strzelam se tym Authorization dzieś po id użytkownika.

Problem jest z tym RequestBody coś chyba, bo jak dam tu Stringa to smiga

data class PostSearchRequestDto(
val playerDto: PlayerDto,
val teamPreferenceDto: TeamPreferenceDto
) {
}