2016-03-16 2 views
11

Ich habe bereits Laravel Webseiten, wo ich hinzufügen/aktualisieren/löschen/Datensätze aus MySQL-Datenbank lesen kann. Laravel Version ist 5.2.15Android App Interaktion mit Laravel Action-Methoden

Jetzt muss ich Datenbank mit Android App integrieren. Um das zu tun, muss ich Json Data posten und lesen.

Hier ist die Frage: Sollte ich 2 öffentliche Maßnahmen haben? Erstens für Webseiten, die Datensätze auf Webseiten anzeigen, und zweitens, um json-Daten in Android zurückzugeben.

Ich meinte, wenn ich Daten auf webPage..I muss den folgenden Code schreiben.

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

aber im Falle von Android App, muss ich Json Daten anfordern.

Bitte schlagen Sie den richtigen Ansatz vor.

+0

Ich bin nicht vertraut von Laravel, aber ich baute 2 Android-App, die mit Webservice (php) seeding sind. Meine Wahl ist Webservice wegen 2 verschiedenen App mit 2 verschiedenen Datentypen aus dem gleichen Datenpool. (Mysql für Web-App, XML für Android-App) – HddnTHA

+0

funktioniert Ihre App nur online oder es funktioniert auch offline? –

+0

es funktioniert nur online. – Pankaj

Antwort

2

Sie sollten eine einfache API entwickeln Sie Ihre APP-Daten von einem Android-Client für den Zugriff auf:

Routen

allererst Sie bestimmte Routen für die API erstellen müssen, durch die Sie werden Ihre Daten im JSON-Format

Authentifizierung

dienen

Die Routen der API sollten die Authentifizierung in Bezug auf das, was Sie gerade tun, anders handhaben: Sie können den klassischen sitzungsbasierten Ansatz nicht verwenden. Stattdessen müssen Sie einen grundlegenden oder Token-basierten Ansatz verwenden. Sie haben verschiedene Alternativen, dies sind einige der am häufigsten verwendeten (von der einfachsten, auf die komplizierteste)

Laravel HTTP Basic Authentication

Laravel Json Web Token Authentication

Laravel OAUTH2

Daten Acess

Sobald Sie Ihre Routen und Authentifizierung eingerichtet haben, müssen Sie Ihre Daten über die API-Routen bereitstellen. Da Sie dieselben Daten in Ihren APP-Routen und API-Routen verwenden, können Sie die Logik des Datenaufbaus und -abrufs in Services umschließen und die Dienste verwenden, um die Daten sowohl in Ihren APP-Routen als auch in API-Routen abzurufen.

Mit verschiedenen Controllern für API und APP Routen, Sie haben:

//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); 
} 

Auf diese Weise können:

  • Encapsulate Daten Gebäude und retrieveng in Dienstleistungen, so dass Sie don‘ t müssen den Code zum Datenabruf zwischen APP- und API-Routen duplizieren.

  • Andere haben c Kontrolleure, um auf APP- oder API-Routen zuzugreifen; so können Sie die Daten erhalten, verwandeln Sie es wie Sie es Kunden, die Aussicht oder api

Über den Service-Klasse

In Bezug auf die Serviceklasse benötigen und dienen die ich erwähnt habe, könnte es sein, Einfach eine oder mehrere Wrapper-Klassen, die Sie sowohl in API- als auch in APP-Controllern verwenden, um die Daten zu erstellen und abzurufen, ohne Code zu aktualisieren. Die Struktur solcher Klassen hängt davon ab, wie Ihre App funktioniert.

Für das Beispiel lassen vermuten Sie es in einer Variablen einige Daten für jedes Projekt des Benutzers speichern berechnen müssen und es dann an die viev senden:

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)); 
} 

Jetzt möchte, wenn die gleiche Sache in der API machen Controller, müssten Sie diesen Code wiederholen, um die Projekte zu erhalten und die Daten zu erstellen. Um dies zu vermeiden, könnten Sie ‚wickeln‘ den Datenzugriff in einer Serviceklasse, und verwenden die gleiche Klasse in boh Controller:

Service-Klasse

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; 
    } 

} 

und verwenden die gleiche Klasse sowohl in der API und APP-Controller:

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

Haben Sie einen Link, der ausführlich über '$ service = App :: make ('your_service');'? Haben Sie einen Link, der die Verwendung des Erstellungs- und Sende-Tokens von Website und Android zu API erklärt? – Pankaj

+0

@PankajGarg: '$ service' ist eine generische High-Level-Klasse, die Sie erstellen sollten, um die Datenabfrage für eine bestimmte Aktion zu umbrechen: Es gibt keinen Link dazu, da Sie ihn abhängig von Ihrer Architektur erstellen sollten. Ich habe keinen spezifischen Link für Token-Authentifizierung, aber Sie können leicht Informationen finden, die auf Google suchen. Oder, wenn Sie eine spezifischere Frage haben, suchen oder nach einem Stack-Überlauf fragen: – Moppo

+0

Sollte ich eine API innerhalb desselben Projekts oder eines anderen Projekts entwickeln? – Pankaj

0

Für Android müssen Sie einen separaten Webdienst schreiben.

+2

Können Sie es mit einem Beispiel genauer beschreiben? Es sieht eher wie ein Kommentar aus. – Pankaj

0

Sie können eine Methode verwenden, um das zu tun. Beispiel

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

hier Problem ist meine alle URLs sind durch Auth Middleware geschützt und die meisten von ihnen haben auch Admin-Berechtigung Middleware implementiert, wenn ich Anfrage mit einer bestimmten Route senden werde ... Ich werde nur Login-Seite bekommen. – Pankaj

+0

Erstellen Sie eine weitere Routengruppe mit einem Präfix und einer API-Middleware, aber verweist auf dieselbe Ressource – oseintow

+0

In jeder Methode gebe ich View with Data zurück, aber in meinem Fall muss ich nur 'json' zurückgeben. Also, wie kann ich Daten gemeinsam nutzen? – Pankaj