SpringBoot WebClient POST request

0

Witam, nie potrafię zrobić zapytania POST do zewnętrznego API, które zwraca informacje o wysyłanym produkcie spozywczym w Body zapytania.
Przykład Post Body wysyłanego:

{ "query": "bread" }

Przykładowa odpowiedź z aplikacji Postman (nie wklejam całej) :

{
"foods": [
{
"food_name": "bread",
"brand_name": null,
"serving_qty": 1,
"serving_unit": "slice",
"serving_weight_grams": 29,
"nf_calories": 77.14,
"nf_total_fat": 0.97,
"nf_saturated_fat": 0.2,
"nf_cholesterol": 0,
"nf_sodium": 142.1,
"nf_total_carbohydrate": 14.33,
"nf_dietary_fiber": 0.78,
"nf_sugars": 1.64,
"nf_protein": 2.57,
"nf_potassium": 36.54,
"nf_p": 28.42,

mój kod :

@GetMapping(path = "siema")
public Food getFood(){
Map<String, String> bodyMap = new HashMap();
bodyMap.put("query","bread");
Food block = webClientBuilder.build()
.post()
.uri("https://trackapi.nutritionix.com/v2/natural/nutrients")
.header("x-app-id", "86ae75c0")
.header("x-app-key", "6e2a5c7f15298becaf573be50ca4cbc3")
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(bodyMap))
.retrieve()
.bodyToMono(Food.class)
.block();
return block;
}

Problem polega na tym, że w zwracanym obiekcie wsystko jest nullem, a wykonując to w Postmanie wszystko działa prawidłowo. Jestem początkujący jeśli chodzi o zapytania do API w Springu. Model zwracanych danych zrobiłem z pomocą pluginu do Intelij json2pojo.
Wszystko jest bezpośrednio w funkcji z Getmapping oraz zwracany jest Food w celach testowych. Docelowo w kontrolerze rest będzie tylko wywołanie funkcji i będzie zwracała Listę.

0

Pewnie dlatego, że endpoint zwraca ci owrapowaną listę foodów, a ty to próbujesz zdeserializować do jednego Food. Zdeserializuj content do poprawnego formatu.

0

@Tyvrel: Po wejściu w zwracana tablice na index 0 również wszystkie wartości są null
@GetMapping(path = "siema") public Food getFood(){ Map<String, String> bodyMap = new HashMap(); bodyMap.put("query","bread"); Food block = webClientBuilder.build() .post() .uri("https://trackapi.nutritionix.com/v2/natural/nutrients") .header("x-app-id", "86ae75c0") .header("x-app-key", "6e2a5c7f15298becaf573be50ca4cbc3") .contentType(MediaType.APPLICATION_JSON) .body(BodyInserters.fromValue(bodyMap)) .retrieve() .bodyToMono(Food.class) .block(); assert block != null; return block.getFoods().get(0); }

https://github.com/MiloszK97/MyBackendApp/tree/main/src/main/java/com/example/demo/MealItem Tu jest cały mój model stworzony po skopoiowaniu odpowiedzi z Postmana do pluginu json2pojo.

0

Okej, to jest rekursywny food, który zawiera inne foody w sobie.

  1. Zdeserializuj sobie response do stringa lub mapy, żeby zweryfikować czy masz problem z samym żądaniem http
  2. Jeśli dostaniesz to samo co w postmanie, to znaczy, że masz problem z definicją Food w pojo

wydaje mi się że WebClient domyślnie używa jacksona do deserializacji, a twój Food jest przygotowany tak, jakby miał być deserializowany przez gsona

0

Cała metoda w jednej linii, ty naprawdę nie widzisz, że tego nie da się czytać? Po drugie, dowiedz się dlaczego w kodzie nie używa się metody .block().

0

W odpowieszi z API dostajesz obiekt z jednym
polem, ktore jest tablicą. Sprobuj najpierw zserializować to do zwyklej HashMapy i zapnij sie debugerem albo ją wyprintuj, to bedziesz widzial o co chodzi.

Zakladam, ze to powinno zalatwic sprawe:

class FoodResponse {
  List<Food> foods;
}
0

@anckor: Niestety to moje pierwsze kroki w zapytaniach do API w Javie, dlatego próbuję wszystkiego co znajdę w sieci. Do tej pory próbowałem zrobić to w Kotlinie z biblioteką Retrofit bez skutku, bo dostawałem same kody 400. Tutaj w Spirngu przynajmniej dostaję 200 i coś w odpowiedz. :)

0

Niestety to moje pierwsze kroki w zapytaniach do API w Javie

Do tej pory próbowałem zrobić to w Kotlinie z biblioteką Retrofit

Utrudnij sobie życie jeszcze bardziej, chociaz juz to zrobiles, bo uzywasz reaktywnego API. Zacznij od czegos prostego i pozniej komplikuj.

0

Nie wiem czy jest tu moderacja, ale proszę zamknąć wątek, niestety w taki sposób nie poradzę sobie z tym zadaiem. Dzięki wszystkim za pomoc. Do zmknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1