Relacje w Angularze(Error 400 - Bad Request)

Relacje w Angularze(Error 400 - Bad Request)
Michał Jelonek
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Witam,

Jestem tu nowy, więc jeśli naruszę jakiś regulamin albo zachowam się niestosownie, to proszę o wyrozumiałość i z góry przepraszam. Piszę tutaj bo mam problem w projekcie i męczę się z nim już dobre parę dni. Mam dość duży problem z dodaniem danych do tabeli połączonej relacją z bazą Springa. Mianowicie samo dodawanie do tabeli działa bez zarzutu, tylko wtedy gdy nie wybieram niczego z Combo Boxa. Gdy już wybiorę dostaję taki oto komunikat:

zone-evergreen.js:2952 POST http://localhost:4200/api/cars 400 (Bad Request)

HttpErrorResponse {headers: HttpHeaders, status: 400, statusText: "Bad Request", url: "http://localhost:4200/api/cars", ok: false, …}

Mam świadomość, że to problem z linkiem i najprawdopodobniej z relacją, ale nie mam pojęcia jak ten problem rozwiązać.

Moje modele wyglądają tak:

Kopiuj
http-cars.model.ts
export class carStatus {
  id: number;
  name: string;
}
 
//carStatus.model.ts (TypeScript)
Kopiuj
export class carType {
  id: number;
  name: string;
}
 
//carType.model.ts (TypeScript)

Aby bardziej zrozumieć problem podaje jeszcze serwisy i komponent dodawania pojazdów(jeśli potrzeba więcej plików proszę pisać):

add-dialog1.component.ts

http-cars.service.ts

car-status.service.ts (carType ma identyczny service tylko ze zmienionymi zmiennymi i nazwami)

config.service.ts (wszystkie zawarte funkcje łączą się z linkiem pochodzącym z proxy.conf.json)

Kopiuj
{
  "/api": {
    "target": "xxx(link)",
    "secure": false,
    "changeOrigin": true,
    "logLevel": "debug"
  }
 
}

No i na końcu jeszcze HTML:

add-dialog1.component.html

Jeśli ktoś ma pomysł dlaczego przy dodawaniu danych bez używania Combo boxa działa ze zarzutu, a jak wybieram coś z tych dwóch combo boxów(czy jednego z nich) to pojawia się powyższy błąd to proszę napiszcie w czym zrobiłem błąd i jak mogę go rozwiązać. (Kumpel z którym robię i jest odpowiedzialny za Springa powiedział, że z jego strony jest wszystko w porządku i jak on wysyła dane przez Postmana to mu wszystko działa. oto przykład zapytania)
Przykład

OB
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Zrób F12 zakładka Network po prawej zakładka headers i zobacz co się fizycznie wysyła do serwera. Zakładam, że korzystasz z Chrome

DW
  • Rejestracja:około 5 lat
  • Ostatnio:4 dni
  • Postów:64
0

Pewnie masz niezgodność w danych, które trafiają do metody POST w serwisie.
Zrób console.log(car) w metodzie POST w serwisie i zobacz w konsoli jak wygląda ten obiekt.
Pole "name" w carStatus i carType nie jest czasami pakowane do BODY metody POST?

Michał Jelonek
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0
dawid.wiklo4 napisał(a):

Pewnie masz niezgodność w danych, które trafiają do metody POST w serwisie.
Zrób console.log(car) w metodzie POST w serwisie i zobacz w konsoli jak wygląda ten obiekt.
Pole "name" w carStatus i carType nie jest czasami pakowane do BODY metody POST?

Gdy dodałem Consol Loga do posta i gdy dodaje dane bez Combo boxów i z danymi z ComboBoxa, to wygląda tak:
Screen z konsoli

edytowany 1x, ostatnio: Michał Jelonek
DW
  • Rejestracja:około 5 lat
  • Ostatnio:4 dni
  • Postów:64
0

CarType oraz CarStatus w jsonie, który wysłałeś w pierwszym poście (Podobno działającym na postmanie) są obiektami z atrybutem "id" typu number.
W Twoim przypadku carType oraz carStatus od razu są przypisywane do typu number. A powinny być atrybutami klasy car z polem id typu number.

Kopiuj
Plik carType.ts
export interface CarType {
   id: number
}

Plik carStatus.ts
export interface CarStatus {
   id: number
}

Plik car.ts
export interface Car {
   /* missing fields*/

   carType: CarType;
   carStatus: CarStatus;
}

Bez ComboBoxów Ci przechodzi wyłącznie dlatego, że są nullami. Nulla w Javie bez problemu można przypisać do obiektu CarStatus lub CarType.

Michał Jelonek
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0
dawid.wiklo4 napisał(a):

CarType oraz CarStatus w jsonie, który wysłałeś w pierwszym poście (Podobno działającym na postmanie) są obiektami z atrybutem "id" typu number.
W Twoim przypadku carType oraz carStatus od razu są przypisywane do typu number. A powinny być atrybutami klasy car z polem id typu number.

Kopiuj
Plik carType.ts
export interface CarType {
   id: number
}

Plik carStatus.ts
export interface CarStatus {
   id: number
}

Plik car.ts
export interface Car {
   /* missing fields*/

   carType: CarType;
   carStatus: CarStatus;
}

Bez ComboBoxów Ci przechodzi wyłącznie dlatego, że są nullami. Nulla w Javie bez problemu można przypisać do obiektu CarStatus lub CarType.

W pierwszym poście wkradł się błąd, w którym link do modelu samochodu wszedł w formatkę kodu do modelu statusu samochodu. Tu jest link do modelu:
https://pastebin.com/Jwhc8SeC

Jeśli chodzi o id to miałeś rację, gdy w ngValue zmieniłem id na name, to w consoli wyświetliły się poprawnie dane, ale nie przeszło to do tabeli:
title

Jeśli chodzi Postmana zapomniałem dodać, że może zapytanie przeszło, ale wynik tego w tabeli przedstawia się następująco:

title

Wiesz może co zmienić w modelu lub w serwisie by można było wyświetlić dane z Combo boxa i dodać je bez błędu 400?

DW
  • Rejestracja:około 5 lat
  • Ostatnio:4 dni
  • Postów:64
0

Po prostu taki sam obiekt musi być zarówno po stronie frontu oraz backendu. Tu naprawdę nie ma żadnej większej filozofii. U Ciebie obiekty są inne, więc dostajesz błąd. Zawsze możesz utworzyć json'a na podstawie danych, które zgromadziłeś i dopiero go wysłać. Jeśli zrobisz to 1:1 w stosunku do tego, co jest w postmanie to będzie ok. Poniżej przykład:

Kopiuj
const body = {
    'photos': [], // cautionPhotoInputData.photos,
    'caretakerCautionId': cautionPhotoInputData.caretakerCautionId,
    'userEmailAddress': cautionPhotoInputData.userEmailAddress
};

return this.http.post(url, body);
edytowany 1x, ostatnio: dawid.wiklo4
Michał Jelonek
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0
dawid.wiklo4 napisał(a):

Po prostu taki sam obiekt musi być zarówno po stronie frontu oraz backendu. Tu naprawdę nie ma żadnej większej filozofii. U Ciebie obiekty są inne, więc dostajesz błąd. Zawsze możesz utworzyć json'a na podstawie danych, które zgromadziłeś i dopiero go wysłać. Jeśli zrobisz to 1:1 w stosunku do tego, co jest w postmanie to będzie ok. Poniżej przykład:

Kopiuj
const body = {
    'photos': [], // cautionPhotoInputData.photos,
    'caretakerCautionId': cautionPhotoInputData.caretakerCautionId,
    'userEmailAddress': cautionPhotoInputData.userEmailAddress
};

return this.http.post(url, body);
Kopiuj
export class Car {
  id: number;
  mark: string;
  model: string;
  registrationNumber: string;
  axes: number;
  yearProduction: string;
  datePurchase: string;
  dateReview: string;
  carType:{
  id:number;
  name:string;
};
  carStatus: {
    id:number;
    name:string;
  };
}

Czyli taki model powinien wystarczyć(ewentualnie odejmując id lub name od tego)?

DW
Próbuj, już dałem Ci wszystkie wskazówki jakie mogłem. Teraz musisz to starannie przełożyć na kod :)
Michał Jelonek
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0
dawid.wiklo4 napisał(a):

Po prostu taki sam obiekt musi być zarówno po stronie frontu oraz backendu. Tu naprawdę nie ma żadnej większej filozofii. U Ciebie obiekty są inne, więc dostajesz błąd. Zawsze możesz utworzyć json'a na podstawie danych, które zgromadziłeś i dopiero go wysłać. Jeśli zrobisz to 1:1 w stosunku do tego, co jest w postmanie to będzie ok. Poniżej przykład:

Kopiuj
const body = {
    'photos': [], // cautionPhotoInputData.photos,
    'caretakerCautionId': cautionPhotoInputData.caretakerCautionId,
    'userEmailAddress': cautionPhotoInputData.userEmailAddress
};

return this.http.post(url, body);

To się jeszcze o jedną rzecz zapytam. To co podałeś w przykładzie, to jest przykład modelu tak?

DW
To po prostu obiekt pełniący funkcję body (json) przesyłanego metodą post. Argumenty możesz tu nazwać dowolnie, jak tylko chcesz. Lecz dobrą praktyką będzie utworzenie nowej klasy/interfejsu, zamiast pisania kodu w ten sposób.
OB
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Zastanawiam się po co wstawiać console.log jak można bezpośrednio w przeglądarce sprawdzić, co się wysyła do serwera. Nagłówki, body, a także i odpowiedź oraz czas odpowiedzi.

Michał Jelonek
Pomogło mi się zorientować, czy zapytanie w ogóle poprawnie się wyświetla. Bez console.loga bym miał tylko komunikat o błędzie. Przykład masz na powyższych obrazkach.
Michał Jelonek
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0
dawid.wiklo4 napisał(a):

Po prostu taki sam obiekt musi być zarówno po stronie frontu oraz backendu. Tu naprawdę nie ma żadnej większej filozofii. U Ciebie obiekty są inne, więc dostajesz błąd. Zawsze możesz utworzyć json'a na podstawie danych, które zgromadziłeś i dopiero go wysłać. Jeśli zrobisz to 1:1 w stosunku do tego, co jest w postmanie to będzie ok. Poniżej przykład:

Kopiuj
const body = {
    'photos': [], // cautionPhotoInputData.photos,
    'caretakerCautionId': cautionPhotoInputData.caretakerCautionId,
    'userEmailAddress': cautionPhotoInputData.userEmailAddress
};

return this.http.post(url, body);
obl napisał(a):

Zastanawiam się po co wstawiać console.log jak można bezpośrednio w przeglądarce sprawdzić, co się wysyła do serwera. Nagłówki, body, a także i odpowiedź oraz czas odpowiedzi.

Szczerze się przyznam, że dalej nie mam pojęcia jak to rozwiązać. Próbowałem techniki tej strony, ale nie dość, że teraz nawet mi zawartości tabeli nie pokazuje, bo
title
to jak próbuję dodać dane z ComboBoxami to error 400 nadal jest sygnalizowany.

edytowany 1x, ostatnio: Michał Jelonek
OB
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:6
0

Próbujesz wywołać metodę map na obiekcie, który jest null-em prawdopodobnie w pliku http-cars.service.ts

W konsoli przeglądarki w zakładce Network można zobaczyć wszystkie informacje dotyczące zapytań. Na jaką ścieżkę poszło, z jakim nagłówkiem, z jaką zawartością, jaka była odpowiedź zwrotna serwera itd.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)