• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring - Custom urls - mojastrona.pl/<string1>/<string1A>

Object Storage Arubacloud
0 głosów
181 wizyt
pytanie zadane 9 lutego 2020 w Java przez reaktywny Nałogowiec (40,990 p.)
Jak zrobić w Springu 5 obsługę URL w postaci:

mojastrona.pl/<string1>/<string1A>
mojastrona.pl/<string1>/<string1B>

mojastrona.pl/<string1>/<string1C>

lub

mojastrona.pl/<string2>/<string2A>

mojastrona.pl/<string2>/<string2B>

lub tylko:

mojastrona.pl/<string3>/

mojastrona.pl/<string45>/

tak aby to nie kolidowało z wywołaniami typu:

mojastrona.pl/o-firmie

mojastrona.pl/faq-pytania-odpowiedzi

mojastrona.pl/kontakt

mojastrona.pl/blog

mojastrona.pl/blog/nowosci

mojastrona.pl/blog/technika

itd. itd.

Chodzi o kolejność wyszukiwania pasujących URL do kontrolerów, tak jak to się dzieje np. w Django.

Potrzebuję by ten sam kontroler obsługiwał:

mojastrona.pl/<string1>

czy

mojastrona.pl/<string5>/<string5D>

ale już np.

mojastrona.pl/blog/technika będzie oczywiście obsługiwane przez inny kontroler (tu bloga).

Pierwszy string po mojastrona.pl/ należy do stałego zbioru nazw (około 65-70 pozycji)

Drugi string w adresie to jakby podkategoria, czyli do każdego "pierwszego stringa" przypisany jest zbiór n nazw (tu zapisałem je używając dużych liter alfabetu). Przy czym każdy człon nr. 1 będzie miał różną liczbę możłiwych członów 2 (jak to nazwałem wcześniej "podkategorii"). W sumie od kilkunastu do ok. 25.

I tak dla "pierwszej frazy"  string7 będą trzy pod kategorie (których nazwy przekazywane są w URL w "drugim członie" / drugiej frazie).

mojastrona.pl/<string7>/<string7A>

mojastrona.pl/<string7>/<string7B>

mojastrona.pl/<string7>/<string7C>

Mam nadzieję, że opisałem problem wystarczająco zrozumiale ;)

 Dzięki za podpowiedzi!
komentarz 14 lutego 2020 przez ValgeHunt22 Obywatel (1,160 p.)

I jak zadziałało?smiley

2 odpowiedzi

+1 głos
odpowiedź 11 lutego 2020 przez mbabane Szeryf (79,280 p.)
edycja 11 lutego 2020 przez mbabane

Kiedy zrobię tak działa tak jak chcesz:

Dwa kontrolery:

@RestController
public class SomeController {
  @GetMapping("/get")
  public String get() {
    return "geta";
  }

  @GetMapping("{id}")
    public String getId(@PathVariable String id) {
      return "getId id:" + id;
  }

  @GetMapping("/get2")
    public String get2() {
      return "get2a";
  }

  @GetMapping("/get2/1")
    public String get21() {
      return "get2/1";
  }
}
@RestController
public class OtherController {
    @GetMapping("/get3")
    public String get3() {
        return "get3a";
    }

    @GetMapping("/get2/2")
    public String get22() {
        return "get2/2";
    }
}

 

komentarz 11 lutego 2020 przez reaktywny Nałogowiec (40,990 p.)
Dzięki za podpowiedź, ale obawiam się, że to nie będzie działało - ale mogę się mylić.

Jeśli dobrze zrozumiałem musiałbym mieć mnóstwo takich metod z dekoratorami GetMapping, albo źle zrozumiałem i Twój kod będzie działał. Na dwoje babka wróżyła :)

Muszę mieć takie ścieżki URL:

super-narzedzia.pl/<pierwszy_czlon>/<drugi_czlon>

super-narzedzia.pl/<pierwszy_czlon>  // wtedy wyświetlam listę wszystkich narzędzi danej marki.

np. :

super-narzedzia.pl/husqvarna/pila-typu-1

super-narzedzia.pl/husqvarna/pila-typu-2

super-narzedzia.pl/husqvarna/szlifierka-typu-1

super-narzedzia.pl/makita/wkretarka-akumulatorowa-typu-1

super-narzedzia.pl/makita/wkretarka-akumulatorowa-typu-2

super-narzedzia.pl/makita/wkretarka-akumulatorowa-typu-3

super-narzedzia.pl/makita/wkretarka-akumulatorowa-typu-4

itd. itd. itd.

Gdzie pierwszy człon, tu Husqvarna lub Makita to jedna z ponad 65 firm !

Drugi człon to będą narzędzia danej marki, każda marka ma ich średnio kilkanaście, ale niektóre nawet 20-25 :)

We Flasku to prościzna, ale akurat tu muszę użyć Springa.
1
komentarz 12 lutego 2020 przez mbabane Szeryf (79,280 p.)

Sprawdź to.

Nie wiem czy jest to najlepszy sposób, ale wygląda że działa:

@RestController
public class SomeController {

  @GetMapping("some-url-{id}")
  public String getId(@PathVariable String id) {
    return "getId " + "id:" + id;
  }
}

 

komentarz 12 lutego 2020 przez reaktywny Nałogowiec (40,990 p.)
To raczej nie to, ale i tak dzięki za kod :)
1
komentarz 12 lutego 2020 przez mbabane Szeryf (79,280 p.)

Dokładny kod pod Twoj przypadek będzie wyglądał tak:

@RestController
public class SimpleController {

    @GetMapping("{producer}/{device}")
    public Device get(@PathVariable String producer,
                      @PathVariable String device) {
        //impl
    }
}

Ale według mnie lepiej będzie jak podzielisz to tak (jeśli możesz):

@RestController
public class SimpleController {

    @GetMapping("{producer}/{device}/{id}")
    public Device get(@PathVariable String producer,
                      @PathVariable String device,
                      @PathVariable String id) {
        //impl
    }

}

device odpowiadał by szlifierka, piła itp.

1
komentarz 12 lutego 2020 przez mbabane Szeryf (79,280 p.)

Jeśli to jest przykład kodu z Flask:

@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
    task = [task for task in tasks if task['id'] == task_id]
    if len(task) == 0:
        abort(404)
    if not request.json:
        abort(400)
    if 'title' in request.json and type(request.json['title']) != unicode:
        abort(400)
    if 'description' in request.json and type(request.json['description']) is not unicode:
        abort(400)
    if 'done' in request.json and type(request.json['done']) is not bool:
        abort(400)
    task[0]['title'] = request.json.get('title', task[0]['title'])
    task[0]['description'] = request.json.get('description', task[0]['description'])
    task[0]['done'] = request.json.get('done', task[0]['done'])
    return jsonify({'task': task[0]})

@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    task = [task for task in tasks if task['id'] == task_id]
    if len(task) == 0:
        abort(404)
    tasks.remove(task[0])
    return jsonify({'result': True})

To w Spring-u jest dokładnie ta sama koncepcja. Zamiast @app.route, masz albo 

@RequestMapping(method = RequestMethod.GET, path = "{producer}/{device}/{id}")

lub wyspecjalizowany, @GetMapping, @PostMapping itd. Zmienne w URI, z tego co rozumiem, to Flask ma między <> a Spring między {}.

komentarz 12 lutego 2020 przez reaktywny Nałogowiec (40,990 p.)

Dzięki wielkie! Sprawdzę ten zapis i podobny kod (użytkownika @ValgeHunt22 - poniżej).

 

+1 głos
odpowiedź 11 lutego 2020 przez ValgeHunt22 Obywatel (1,160 p.)
edycja 12 lutego 2020 przez ValgeHunt22
@RestController
public class ToolController {
    @GetMapping("{brand}/{tool}")
    public ResponseEntity<Void> getTool(@PathVariable String brand, @PathVariable String tool){
        implementation...
    }
}

Mam nadzieje że pomogłem.

 

komentarz 12 lutego 2020 przez reaktywny Nałogowiec (40,990 p.)
Sprawdzę ten kontroler i dam znać czy pasuje, wygląda "na oko" OK. Dzięki!

Podobne pytania

0 głosów
0 odpowiedzi 98 wizyt
pytanie zadane 26 sierpnia 2019 w JavaScript przez MAXIM7 Obywatel (1,990 p.)
+1 głos
1 odpowiedź 446 wizyt
pytanie zadane 8 kwietnia 2016 w JavaScript przez ScriptyChris Mędrzec (190,190 p.)
0 głosów
1 odpowiedź 1,593 wizyt

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...