Kaynaklar için bir dizi kimlik alan bir REST API nasıl oluşturulur?


103

Projem için bir REST API oluşturuyorum. Belirli bir kullanıcının BİLGİLERİNİ almak için API:

api.com/users/[USER-ID]

Ayrıca istemcinin bir kullanıcı kimlikleri listesine girmesine izin vermek istiyorum. API'yi RESTful olacak ve kullanıcı kimliklerinin bir listesini alacak şekilde nasıl yapılandırabilirim?


En genel cevap @Shuja tarafından verilir, çünkü postacıdan gelen diğer cevaplar işe yaramamıştır ve veritabanı arka ucuna bağlıdır. Ancak, birden çok kimlik için istekte bulunmak üzere bir API uç noktanız olabilir.
Eswar

Yanıtlar:


97

Tüm parametrelerinizi URL üzerinden geçiriyorsanız, muhtemelen virgülle ayrılmış değerler en iyi seçim olacaktır. O zaman aşağıdaki gibi bir URL şablonunuz olur:

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

7
@uclajatt, REST bir mimari modeldir ve bir protokol değildir ve bugün mevcut olan başlıca REST API'lerini incelerseniz, onu uygulamanın birden fazla yolu olduğunu göreceksiniz. Önerdiğim yaklaşım, burada açıklanan tüm kısıtlamaları gerçekleştirdiği için muhtemelen konsepte en yakın olanlardan biridir: en.wikipedia.org/wiki/… . CSV'yi yalnızca isteklerdeki dizileri temsil etmek için kullanırsınız, hizmet yanıtları ise XML veya JSON kullanılarak serileştirilmelidir. Yaklaşımımı REST olarak değerlendirmemenizin belirli nedenleri var mı?
Florin Dumitrescu

10
Neden bu değil? api.com/users?id=id1&id=id2&id=id3&id=id4&id=id5
senfo

7
@senfo, ben id = id1, id2, id3'ü tercih ediyorum çünkü URI'yi kısaltır ve okumayı kolaylaştırır (örneğin bir hata ayıklama işlemi sırasında bir insan tarafından). Her değer için ayrı parametreler, URI'nin takip edilmesini özellikle, ids arasında başka parametreler varsa daha zor hale getirir: api.com/users?id=id1&id=id2&joined-after=2013-01-01&id=id3
Florin Dumitrescu

12
Bununla birlikte, çoğu web sunucusu, yaklaşık 2.000 baytlık URL uzunluğunu destekler. API desteğimi 5.000 kimliğe kadar nasıl yapabilirim?
nicky_zs

6
gibi URL'lerin içinde @senfo …?id=1&id=2&id=3, garantisi yoktur yinelenen sorgu parametreleri dizide birleştirilirler olacağını. Yukarıdaki sorgu dizesiyle, PHP size ideşit olduğunu [1, 2, 3]söyler, ancak Ruby on Rails size eşit olduğunu söyler 3ve diğer çerçeveler de farklı davranabilir, örneğin ideşittir diyebilir 1. Gibi URL'ler …?id=1,2,3bu karışıklık olasılığından kaçınır.
Rory O'Kane

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

IMO, yukarıdaki aramalar RESTful görünmüyor, ancak bunlar hızlı ve verimli çözümlerdir (y). Ancak URL'nin uzunluğu web sunucusu ile sınırlıdır, örneğin tomcat .

RESTful deneme:

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

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

Sunucu, yeni oluşturulan toplu görev kaynağının URI'sini yanıtlayacaktır .

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

Artık istemci, yoklama yoluyla toplu yanıt veya görev ilerlemesini alabilir

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


Başkaları bu sorunu şu şekilde çözmeye çalıştı :


7
Birden çok sonuç almak için POST isteği RESTful değil.
Örneğiniz

2
Geçici kaynak yaratmak RESTful'dur, değil mi? Ve GET kullanarak kaynaklar alıyorum, yine RESTful.
Nilesh

evet, ancak bunların hiçbiri orijinal soruda yoktu, sadece birden fazla kullanıcı kimliği için bilgi almayı soruyor
Anentropic

1
@Anentropic'e işaret ettiğiniz için teşekkürler. Soruyu tekrar okudum , kaynaklar için bir dizi kimlik alan bir REST API nasıl oluşturulur? ve katılıyorum, cevabım farklı. Ne demek istediğini anlamadığım için üzgünüm.
Nilesh

Birden fazla kullanıcı elde etmenin RESTful yolu bu mekanizma aracılığıyla olduğu için bu cevabı beğendim.
Shane Courtrille

20

Aynı şeyi kullanarak yapmanın başka bir yolunu buluyorum @PathParam. İşte kod örneği.

@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.
}

Aşağıdaki url'yi kullanarak servisi arayın.

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

nerede

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

5
Bunu beğendim çünkü GET tutarlı. Bu örnekte bir numara veya çok sayıda kullanabilirsiniz. Ve arka uca tam olarak istediğiniz kimlikleri verdiğiniz için bu gerçekten bir arama (parametreler) değildir.
markthegrea

1
Görüyorum ki en çok oy alan cevap işe yaramıyor ve cevabınız muhtemelen en genel olanı. Cevap olarak kabul edilmelidir.
Eswar

18

Bu yaklaşımı tercih ettiğim kadarıyla: -

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

Doğru yol

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

veya

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

Bu nasıl raf yapar. Bu nasıl php yapar. Düğüm de böyle yapar ...


19
PHP standartlarına uyulacak bir kılavuz olarak atıfta bulunmanın en iyi tavsiye olduğundan emin değilim. eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design
trebor

Flask böyle yapmaz.
jscul

0

ASP.NET MVC kullanarak bir Rest API veya dinlendirici bir proje oluşturabilir ve verileri JSON olarak döndürebilirsiniz. Örnek bir denetleyici işlevi şöyle olabilir:

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

Ardından, Ids dizisini sağlayan normal bir AJAX işlevi aracılığıyla GetUsers işlevini çağırırsınız (bu durumda, diziyi dize olarak göndermek ve denetleyicide kaydileştirmek için jQuery stringify kullanıyorum, ancak yalnızca ints dizisini gönderebilir ve alabilirsiniz denetleyicideki int dizisi olarak). Verileri etki alanları arası json olarak döndüren ve herhangi bir uygulamadan kullanılabilen ASP.NET MVC kullanarak bütün bir Restful API oluşturdum. Tabii ki ASP.NET MVC kullanabiliyorsanız.

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

3
Maalesef API'nin nasıl uygulanacağını sormuyordum. İstemcinin bir dizi kullanıcı hakkındaki bilgilere erişebilmesi için API URI'sinin nasıl oluşturulacağını soruyordum. İd'leri sorgu parametreleri aracılığıyla geçirebilirim, ancak bunun çok dinlendirici olmayacağına inanıyorum.
uclajatt

@uclajatt Neden RESTful olmadığını düşünüyorsunuz?
Darrel Miller

1
Kimliklerin veya diğer değerlerin sorgu parametreleri aracılığıyla geçirilmesinin gerçekten de bir sistemle etkileşim kurmanın dinlendirici bir yaklaşımı olduğuna inanıyorum. Uri sizi nasıl inşa edeceğiniz size kalmış. Kullanıcılar / tümü, kullanıcılar / dizi, dizi / kullanıcılar veya mantıklı olduğunu düşündüğünüz diğer adlandırma kuralları. MVC çerçevesinin nasıl çalıştığını göz önünde bulundurarak dinlendirici bir API oluşturmak için kullanması çok kolaydır, çünkü Uris'i ihtiyaç duyduğunuz şekilde düzenleyip inşa edebilirsiniz. Uris'inize sahip olduğunuzda, AJAX'ı tek bir dize olarak kullanarak parametreleri iletebilirsiniz, veya bir form kullanıyorsanız ve bir MVC eylemine gönderi yapıyorsanız birden çok değer olarak.
Vasile Laur

1
@uclajatt Thats, bu yazıda size iki kez soruldu, neden bir sorgu parametresinde virgülle ayrılmış bir listeyi geçmenin RESTful olmadığını düşündüğünüz ve bu çok makul çözümlerden herhangi birini kabul etmek bir yana, yanıtlamakla bile uğraşmıyorsunuz!? ! Hiç hoş değil.
samis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.