2016-03-16 13 views
11

Mam już strony internetowe Laravel, gdzie mogę dodawać/aktualizować/usuwać/Odczytywanie wpisów z bazy danych MySQL. Wersja Laravel to 5.2.15Interakcja aplikacji Android z metodami Laravel Action

Teraz muszę zintegrować bazę danych z aplikacją na Androida. W tym celu muszę opublikować i przeczytać Json Data.

Oto pytanie: czy powinienem mieć 2 publiczne metody działania? Po pierwsze dla strony internetowej, która będzie wyświetlać rekordy na stronie internetowej, a druga będzie zwracać dane JSON w systemie Android.

Miałem na myśli, kiedy zwracam dane do strony internetowej. Będę musiał napisać poniższy kod.

return View("View-Path", array("Data" => $Data)); 

, ale w przypadku aplikacji na Androida będę musiał poprosić o Json Data.

Proszę zasugerować właściwe podejście.

+0

Nie jestem zaznajomiony z Laravel, ale zbudowałem 2 aplikacje na Androida, które są zaimplementowane w webservice (php). Moim wyborem jest usługa sieciowa z powodu 2 różnych aplikacji używających 2 różnych typów danych z tej samej puli danych. (Mysql dla aplikacji internetowej, xml dla aplikacji na Androida) – HddnTHA

+0

czy Twoja aplikacja działa tylko w trybie online lub może działać w trybie offline? –

+0

będzie działać tylko online. – Pankaj

Odpowiedz

2

Należy opracować prosty interfejs API do dostępu do swoich danych aplikacji z Android klient:

Trasy

Przede wszystkim trzeba stworzyć jakieś konkretne trasy dla API, przez które będziesz służyć dane w formacie JSON

Authentication

Trasy interfejsu API powinny obsługiwać uwierzytelnianie w inny sposób pod względem tego, co teraz robisz: nie można używać klasycznego podejścia opartego na sesji. Zamiast tego należy zastosować podejście bazowe lub oparte na tokenach. Masz różne alternatywy, są to jedne z najczęściej używanych (od najprostszych do najbardziej skomplikowanych)

Laravel HTTP Basic Authentication

Laravel Json Web Token Authentication

Laravel OAUTH2

danych Acess

Po skonfigurowaniu tras i uwierzytelnieniu musisz podawać dane za pośrednictwem tras API. Ponieważ używasz tych samych danych w trasach aplikacji i trasach API, możesz owijać logikę budowania i pobierania danych w usługach, a także korzystać z usług, aby uzyskać dane zarówno na trasach aplikacji, jak i trasach API.

Stosując różne kontrolery do API i APP trasach, masz:

//APP Controller method for route: www.app.com/app-route/users 
public function getUsers() 
{ 
    //wrap the logic to build the data inside the service 
    $service = App::make('your_service'); 

    //once is ready, get the built data from the service 
    $data = $service->getData(); 

    return View("View-Path", array("Data" => $data)); 
} 

//API Controller method for route: www.app.com/api/users 
public function getUsers() 
{ 
    //use the same service to build and get the data you need 
    $service = App::make('your_service'); 

    $data = $service->getData(); 

    return response()->json($data); 
} 

W ten sposób można:

  • budynek danych hermetyzacji i retrieveng w usługach, tak że don” t potrzeba duplikowania kodu do pobierania danych między trasami APP i API

  • Mieć różne c ontrollery, aby uzyskać dostęp do tras APP lub API; dzięki czemu można uzyskać dane, przekształcenie go jak trzeba i służyć zarówno do poglądów lub klientów api

O klasę usług

w odniesieniu do klasy usługi już wspomniano, może to być po prostu jedna lub wiele klas opakowania, których używasz zarówno w kontrolerach API, jak i APP do budowania i pobierania danych bez powtarzania kodu. Struktura takich zajęć zależy od sposobu działania aplikacji.

Na przykład załóżmy, trzeba obliczyć pewne dane dla projektu każdego użytkownika, należy go przechowywać w zmiennej, a następnie wysłać go do viev:

public function getUsers($request) 
{ 
    $user = Users::with('projects')->find($request->user_id)->get(); 

    $data = []; 
    foreach ($user->projects as $p) 
    { 
     //compute some data you need and store it in $data; 
    } 

    return View("View-Path", array("Data" => $data)); 
} 

Teraz, jeśli chcesz zrobić to samo w API kontroler, musisz powtórzyć ten kod, aby uzyskać projekty i utworzyć dane. Aby tego uniknąć, można „owinąć” dostęp do danych w klasie usług i używać tej samej klasy w kontrolerach BOH:

klasy usługi

public class UserDataBuilder 
{ 
    protected $user; 

    public function setUser(Authenticatable $user) 
    { 
     $this->user = $user; 
    } 

    public function getData() 
    { 

     $user = Users::with('projects')->find($this-user->id)->get(); 

     $data = []; 
     foreach ($user->projects as $p) 
     { 
      //compute some data you need and store it in $data; 
     } 

     return $data; 
    } 

} 

i używać tej samej klasy, zarówno czynnych i Kontrolery APP:

//APP controller: get the data and pass to the view 
public function getUsers($request) 
{   
    $service = App::make(UserDataBuilder::class); 
    $service->setUser(User::find($request->user_id)->get()); 

    return View("View-Path", array("Data" => $service->getData()); 
} 

//API controller: get the data and convert to JSON 
public function getUsers($request) 
{  
    $service = App::make(UserDataBuilder::class); 
    $service->setUser(User::find(1)->get()); 

    return response()->json($data); 
} 
+0

Czy masz jakiś link, który dokładnie wyjaśnia o '$ service = App :: make ('your_service');'? Czy masz jakiś link wyjaśniający użycie kreacji i wysyłania tokena ze strony internetowej i Androida do interfejsu API? – Pankaj

+0

@PankajGarg: '$ service' jest ogólną klasą wysokiego poziomu, którą powinieneś utworzyć, aby zawijać pobieranie danych dla określonego działania: nie ma linku, ponieważ powinieneś go utworzyć w zależności od architektury. Nie mam żadnego konkretnego łącza do uwierzytelniania tokena, ale możesz łatwo znaleźć informacje przeszukujące google. Lub, gdy masz bardziej szczegółowe pytanie, wyszukaj lub zapytaj na przepełnienie stosu – Moppo

+0

Czy powinienem stworzyć API w tym samym projekcie lub innym projekcie? – Pankaj

0

Dla Androida musisz napisać osobny serwis internetowy.

+2

Czy możesz opisać to bardziej szczegółowo na przykładzie? Wygląda bardziej jak komentarz. – Pankaj

0

Możesz użyć jednej metody, aby to zrobić. Przykład

public function someMethod(Request $request){ 

    $Data = ['laravel','is','awesome']; 

    // If the request has the content type is json return a json response 
    // So you android request will be true for this request 
    // else return data to webpage 
    if($request->isJson()){ 
     return response()->json($Data); 
    } 

    return View("View-Path", array("Data" => $Data)); 

} 
+0

Tutaj problem polega na tym, że wszystkie moje adresy URL są chronione przez auth Middleware, a większość z nich ma autoryzację administratora Middleware zaimplementowaną, więc kiedy wyślę żądanie używając konkretnej trasy ... otrzymam tylko stronę logowania. – Pankaj

+0

Utwórz inną grupę tras z prefiksem i oprogramowaniem pośredniczącym api, ale wskazuje na ten sam zasób. – oseintow

+0

W każdej metodzie zwracam widok z danymi, ale w moim przypadku wystarczy zwrócić 'json'. Więc jak mogę zrobić wspólne wykorzystanie danych? – Pankaj