2013-09-01 12 views
6

Jestem dość nowy w wielu koncepcjach i technologiach wykorzystywanych w tym pytaniu, dlatego byłbym wdzięczny za zrozumienie i pomoc początkującym dla społeczności. Korzystam z wersji Play Framework w wersji 2.1.3 i potrzebuję danych POST do usługi internetowej RESTful, aby można ją było umieścić w zdalnej bazie danych. Odpowiedź XML zostanie zwrócona, informując o sukcesie lub niepowodzeniu.Jak: Uzyskiwanie dostępu do usług RESTful Web przy użyciu Play 2.1 dla początkujących

Jestem pewna, że ​​zdajesz sobie sprawę, że dokumentacja dla Play Framework jest dość uboga i nie jest w żaden sposób pomocna dla początkujących, dlatego nie jestem pewien, jak wykonać to zadanie mając na uwadze najlepsze praktyki. Szukam rozwiązania Java tego problemu, nie mam czasu, aby nauczyć się języka Scala. Moje doświadczenie z usługami sieciowymi jest dość ograniczone, zwykle implementowałbym wzorzec projektowy DAO (lub korzystał z jednej z wielu dostępnych bibliotek ORM w zależności od potrzeb) w mojej aplikacji i używał JDBC do łączenia się bezpośrednio z bazą danych. To nie jest opcja tutaj.

Moje pierwsze pytanie musiałoby być, czy istnieje zalecany wzorzec projektowania dostępu do usług sieciowych? Następnie, biorąc pod uwagę strukturę MVC Play, jak najlepiej zaimplementować taki wzór projektu, spakować dane (zakładając, że aplikacja już przechwyciła i zweryfikowała dane od użytkownika), wysłać je i przetworzyć odpowiedzi z powrotem do użytkownika?

Wiem, że jest to dość długie pytanie, ale moim zamiarem jest stworzenie bazy wiedzy dla początkujących, którzy mogą łatwo wejść z ograniczonym doświadczeniem, czytać, rozumieć i replikować to, co znajdą tutaj, aby stworzyć działające rozwiązanie. . Po dość obszernym przeszukaniu sieci znalazłem kilka rozłącznych fragmentów, ale nic konkretnego nie dotyczy tych technologii i nie ma aktualnych samouczków. Dziękuję za Twój czas.

+0

Ten post jest bardzo podobny, choć nie jest prosto powielać wierzę: http://stackoverflow.com/questions/4379485/restful-on-play-framework - połączyć to z Sztuka teatralna! ToDo List example i powinno dać ci solidny punkt wyjścia. – pfairbairn

+0

Dziękuję za odpowiedź, ponieważ pytanie zadano w 2010 roku. Zakładam, że chodzi o grę w wersji ramowej 1, ponieważ gra 2 została wydana dopiero w 2012 roku. Nie są one w żaden sposób takie same. Mogę się jednak mylić i dwukrotnie sprawdzę pocztę. Bardziej skupiam się również na najlepszych praktykach. – Hegemon

+0

Punkt wyjściowy, jednak odwołując się do tego wpisu za pomocą indeksu Java Play 2.1 ToDo, http://www.playframework.com/documentation/2.1.x/JavaTodoList, informacje o routingu, korzystaniu z POST, GET i PUT dla żądań HTTP sprawiają, że wpis SO nadal wydaje się przydatny, nawet jeśli jest nieco przestarzały. – pfairbairn

Odpowiedz

11

Tworzenie żądań jest proste. Najpierw podaj adres URL. Istnieją różne metody dodawania typów treści, parametrów zapytań, limitów czasu itp. Do żądania. Następnie wybierz typ żądania i opcjonalnie dodaj zawartość do wysłania. Przykłady:

WSRequestHolder request = WS.url("http://example.com"); 
request.setQueryParameter("page", "1"); 
Promise<Response> promise = request.get(); 
Promise<Response> promise = WS.url("http://example.com").post(content); 

Skomplikowana część jest wysłanie go i używać odpowiedź na żądanie. Zakładam, że masz kontroler, który powinien zwrócić użytkownikowi numer Result, na podstawie odpowiedzi serwisu WWW. Wynikiem jest zazwyczaj renderowany szablon lub może po prostu kod statusu.

Gra zapobiega blokowaniu przy użyciu Futures and Promises. Metoda async sterownika pobiera Promise<Result> i zwraca wynik (wartość późniejszą) w pewnym momencie później. Prosta w użyciu obietnica jest dostarczana przez metody przedstawione powyżej. Nie musisz przejmować się ich implementacją, musisz tylko wiedzieć, że obiecują dostarczyć Response po zakończeniu żądania.

Wskazówka tutaj jest problem: Podczas tworzenia żądania ze WS.url("...").get() da ci Promise<Response> chociaż async zajmuje Promise<Result>. Tutaj musisz sam wprowadzić inną obietnicę, która przekształci odpowiedź na wynik, używając metody map. Jeśli będziesz postępować zgodnie z dokumentacją Play, będzie to trochę zagmatwane, ponieważ Java nie ma zamknięć (jeszcze) i wszystko musi być opakowane w klasę. Nie musisz jednak używać klas anonimowych w wywołaniu metody. Jeśli wolisz bardziej czystego kodu, można również zrobić to w ten sposób:

return async( 
    request     
    .get()     // returns a `Promise<Response>` 
    .map(resultFromResponse) // map takes a `Function<Response, Result>` and 
          // returns the `Promise<Result>` we need 
); 

Przedmiotem resultFromResponse może wyglądać następująco.Jest to tak naprawdę jak uciążliwa definicja jakiejś metody wywołania zwrotnego, która przyjmuje tylko jeden argument i zwraca wartość.

Function<Response, List<T>> resultFromResponse = 
    new Function<Response /* 1st parameter type */, Result /* return type */>() { 
     @Override 
     public Result apply(Response response) { 
      // example: read some json from the response 
      String message = response.asJson().get("message"); 
      Result result = ok(message); 
      return result; 
     } 
    }; 

Jak @itsjeyd zauważył w komentarzach, kiedy calling webservices in Play 2.2.x nie owijają połączenie w async więcej. Po prostu zwracają Promise<Result>:

public static Promise<Result> index() { 
    return request.get().map(resultFromResponse); 
} 
+1

Dziękujemy za dogłębną odpowiedź, chociaż większość tego jest dostępna na stronie Play, udało się wyjaśnić wiele zamieszania. Spróbuję. – Hegemon

+1

+1 za wspaniałą odpowiedź. @Hegemon, ponieważ chciałeś, aby to stało się "bazą wiedzy", chciałbym dodać, że w grze! 2.2.x, zwracanie 'Result's przez' async' jest przestarzałe; akcje wykonujące połączenia z innymi usługami sieciowymi powinny zamiast tego zwracać 'Promise '. Można to osiągnąć, zmieniając powyższe polecenie 'return' na' return request.get(). Map (resultFromResponse); '. – itsjeyd

Powiązane problemy