• 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>

0 głosów
498 wizyt
pytanie zadane 9 lutego 2020 w Java przez reaktywny Nałogowiec (46,230 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,260 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 (46,230 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,260 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 (46,230 p.)
To raczej nie to, ale i tak dzięki za kod :)
1
komentarz 12 lutego 2020 przez mbabane Szeryf (79,260 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,260 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 (46,230 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 (46,230 p.)
Sprawdzę ten kontroler i dam znać czy pasuje, wygląda "na oko" OK. Dzięki!

Podobne pytania

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

93,720 zapytań

142,636 odpowiedzi

323,264 komentarzy

63,268 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...