Pytanie odnośnie REST

0

Witam
Bawię się trochę REST'em i mam kilka pytań co do Was. Z jednej strony mam materiał z kursu (de facto na kursie on działał), mam również tutorial pt. Hello World REST. A u mnie nie działa :)
Robię krok po kroku i zwyczajnie nie działa i nie mam zielonego pojęcia o co chodzi. Server mam poprawnie skonfigurowany WildFly, inne aplikacje, które mają łączyć się z serwerem działają a REST nie chce a internet nie przynosi odpowiedzi.


package pl.test.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/hello")
public class HelloRest {
	
	@GET
	@Path("{name}")
	public String getImie(@PathParam("name") String name) {
		String odpowiedzZwrotna = "hello " + name;
		
		return odpowiedzZwrotna;
	}

}



Po uruchomieniu łaczusie się adres http://localhost:8080/MojRest/, zgodnie z tym co wiem wpisuje http://localhost:8080/MojRest/hello/Ada
I powinno się wyświetlić " hello Ada", a otrzymuje informacje pt. "Nie można odnaleźć strony sieci Web". Co tu jest zrobione źle?
Dodam, że jest to jako Dynamic Web Project a server przy deployu nie wyrzuca żadnych błędów oraz poprawnie się uruchamia.

0

IMO brakuje Ci adnotacji która mówi iż to co zwracasz ma być odpowiedzią, a nie nazwą strony jaką ma wyświetlić, potrzeba dodać adnotację @ResponseBody

public @ResponseBody String function()

Aczkolwiek mogę się mylić, pokazałeś bardzo mały wycinek kodu, zepsuć mogłeś coś gdzieś indziej

0

Na początek zainteresował bym się poprawnym nazewnictwem obiektów, klas i zmiennych. Trzymaj się jednego języka i najlepiej angielskiego bo twory typu "getImie" "return odpowiedzZwrotna" wyglądają komicznie

0

Jest to cały kod. Najprostszy hello World. Mam bardziej rozwinięte przykłady, jednak nie wiem gdzie szukać. Stwierdziłem że zrobię prosty hello World i postaram się przeanalizować co mogło pójść nie tak, czy może coś w kodzie czy może gdzieś indziej :)

Odnośnie kolejnej odpowiedzi: post ten dotyczy pewnego tematu, twój post absolutnie nic nie wnosi a szkoda mi czasu żeby odpowiadać na zaczepki. Znam doskonale poprawne nazewnictwo, ALE jest to tylko prosty twór na przykładzie którego chce dojść gdzie co nie gra. W tym wypadku nazewnictwo... raczej nic nie zmieni.

Za chwilę sprawdzę pomysł ale wydaje mi się że chyba nie o to chodzi. Kilka miesięcy temu działało poprawnie na innym komputerze, i przyznam szczerze, że nigdzie nie widziałem tego rozwiązania. Tak czy inaczej zaraz sprawdzę

0

Niestety, problem pozostaje bez zmian. Dziś krok po kroku wykonałem tutorial z YouTube aby mieć pewność że dobrze mam kod. I prawdę mówiąc dalej nie działa. Może źle wpisuje URL? Local host + port + nazwa projektu + patch z klasy tak?

0

Myślę, że problem zasygnalizował kolega Emdzej93. Konieczne jest określenie, co zwraca funkcja:
"CORS (ang. Cross-Origin Resource Sharing) jest mechanizmem używanym przez przeglądarki. Polega on na dodawaniu odpowiednich nagłówków do odpowiedzi serwera. Zawartość tych nagłówków informuje przeglądarkę czy może używać wyników tego zapytania." Po @GET należałoby dodać np. @Produces("text/html").

0

W związku z CORS należy dodawać odpowiednie nagłówki do odpowiedzi serwera testowego. Można zrobić to następująco:

@Provider
public class CORSFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        if (!headers.containsKey("Access-Control-Allow-Origin")) {
            headers.add("Access-Control-Allow-Origin", "*");
        }
        if (!headers.containsKey("Access-Control-Allow-Headers")) {
            headers.add("Access-Control-Allow-Headers", "Content-Type");
        }
        if (!headers.containsKey("Access-Control-Allow-Methods")) {
            headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
        }
    }
}

Oczywiście przy @GET powinna być odpowiednia adnotacja @Produces.

0

Ja bym zaczął od prostszego przypadku, bez zmiennej części Path. Działa?

No i można jeszcze logi poczytać, ale z podwyższonym poziomem logowania. Serwer pewnie opisuje, dlaczego odrzucił dane żądanie. Może nie trafiło w ogóle do serwletu.

Kod jest niby krótki, ale to jednak nie jest całość. Możesz jeszcze stworzyć kompletny projekt (jak najkrótszy, tak jak robisz) i wrzucić na github. Wtedy każdy chętny forumowicz może sobie sam odpalić i zdiagnozować.

0

Ja bym spróbował sprawdzić:

  • http://localhost:8080/hello/Ada - zdarzyło mi się w jednym z projektów Springa (kiedy jeszcze myślałem, że jestem na niego gotowy), że niepotrzebna była nazwa mojego projektu i spędziłem kupę czasu na szukaniu mojej strony :P
  • może powinno być:
@Path("/{name}")
  • A może warto przetestować coś takiego?
@GET
    @Path("/hello/{name}")
    public String getImie(@PathParam("name") String name) {
        String odpowiedzZwrotna = "hello " + name;

        return odpowiedzZwrotna;
    }
// Usuwając oczywiście adnotację `@Path("/hello")`
  • jeśli jesteś pewien, że powinno działać to wypisać wszystkie adresy jakie przyjdą Ci do głowy i przelecieć je curlem, wyniki przeanalizować jakimś grepem, żeby sprawdzić czy znajduje się tam Twoje upragnione "hello"
0

jareczek dzięki za podpowiedz. Prześledziłem dokładnie logi z serwera i trafiłem na informacje, że brakuje serwletu bądź klasy która rozszerza "Application" z pakietu"javax.ws.rs.ApplicationPath;". Dodałem jako osobna klasa i poszło bez zająknięcia. Tak więc widzisz, "drobnostka" a jednak :)
Tak czy inaczej dzięki raz jeszcze.

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