it-swarm.com.de

Wie baue ich ein REST API, die ein Array von IDs für die Ressourcen benötigt

Ich baue eine REST - API für mein Projekt. Die API zum Abrufen der INFO eines bestimmten Benutzers lautet:

api.com/users/[USER-ID]

Ich möchte dem Kunden auch erlauben, eine Liste mit Benutzer-IDs zu übergeben. Wie kann ich die API so erstellen, dass sie RESTful ist und eine Liste mit Benutzer-IDs enthält?

84
uclajatt

Wenn Sie alle Parameter an die URL übergeben, sind wahrscheinlich durch Kommas getrennte Werte die beste Wahl. Dann hätten Sie eine URL-Vorlage wie die folgende:

api.com/users?id=id1,id2,id3,id4,id5
83
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

Die oben genannten Aufrufe von IMO sehen nicht RESTful aus. Dies ist jedoch eine schnelle und effiziente Lösung (y). Die Länge der URL ist jedoch durch den Webserver begrenzt, z. B. Tomcat

RESTful Versuch:

POST http://example.com/api/batchtask

   [
    {
      method : "GET",
      headers : [..],
      url : "/users/id1"
    },
    {
      method : "GET",
      headers : [..],
      url : "/users/id2"
    }
   ]

Der Server antwortet auf die URI der neu erstellten Ressource batchtask.

201 Created
Location: "http://example.com/api/batchtask/1254"

Jetzt kann der Client eine Stapelantwort oder einen Taskfortschritt durch Abfragen abrufen

GET http://example.com/api/batchtask/1254


So versuchen andere, dieses Problem zu lösen:

24
Nilesh

Ich finde einen anderen Weg, das gleiche zu tun, indem ich @PathParam verwende. Hier ist das Codebeispiel.

@GET
@Path("data/xml/{Ids}")
@Produces("application/xml")
public Object getData(@PathParam("zrssIds") String Ids)
{
  System.out.println("zrssIds = " + Ids);
  //Here you need to use String tokenizer to make the array from the string.
}

Rufen Sie den Dienst mit folgender URL auf.

http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76

woher

http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76
16
Shuja

So sehr ich diesen Ansatz vorziehen: - 

    api.com/users?id=id1,id2,id3,id4,id5

Der richtige Weg ist

    api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

oder

    api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5

So macht rack es. So macht php es. So funktioniert node auch ...

14
Kyristopher

Sie können mit ASP.NET MVC eine Rest-API oder ein restful-Projekt erstellen und Daten als JSON zurückgeben. Eine Controller-Beispielfunktion wäre:

        public JsonpResult GetUsers(string userIds)
        {
           var values = JsonConvert.DeserializeObject<List<int>>(userIds);

            var users = _userRepository.GetAllUsersByIds(userIds);

            var collection = users.Select(user => new { id = user.Id, fullname = user.FirstName +" "+ user.LastName });
            var result = new { users = collection };

            return this.Jsonp(result);
        }
        public IQueryable<User> GetAllUsersByIds(List<int> ids)
        {
            return _db.Users.Where(c=> ids.Contains(c.Id));
        }

Dann rufen Sie einfach die GetUsers-Funktion über eine reguläre AJAX - Funktion auf, die das Array von Ids liefert (in diesem Fall verwende ich jQuery stringify, um das Array als String zu senden und es im Controller wieder zu entmaterialisieren. Sie können das Array jedoch einfach senden von Ints und erhalten sie als Array von Int's im Controller) Ich habe eine vollständige Restful-API mit ASP.NET-MVC erstellt, die die Daten als domänenübergreifender Json zurückgibt und von jeder App verwendet werden kann. Das natürlich, wenn Sie ASP.NET MVC verwenden können. 

function GetUsers()
    {
           var link = '<%= ResolveUrl("~")%>users?callback=?';
           var userIds = [];
            $('#multiselect :selected').each(function (i, selected) {
                userIds[i] = $(selected).val();
            });

            $.ajax({
                url: link,
                traditional: true,
                data: { 'userIds': JSON.stringify(userIds) },
                dataType: "jsonp",
                jsonpCallback: "refreshUsers"
            });
    }
0
Vasile Laur