ฉันกำลังสร้าง REST API สำหรับโครงการของฉัน API สำหรับการรับ INFO ของผู้ใช้คือ:
api.com/users/[USER-ID]
ฉันต้องการอนุญาตให้ลูกค้าส่งผ่านรายการ ID ผู้ใช้ ฉันจะสร้าง API เพื่อให้ RESTful และอยู่ในรายการ ID ผู้ใช้ได้อย่างไร
ฉันกำลังสร้าง REST API สำหรับโครงการของฉัน API สำหรับการรับ INFO ของผู้ใช้คือ:
api.com/users/[USER-ID]
ฉันต้องการอนุญาตให้ลูกค้าส่งผ่านรายการ ID ผู้ใช้ ฉันจะสร้าง API เพื่อให้ RESTful และอยู่ในรายการ ID ผู้ใช้ได้อย่างไร
คำตอบ:
หากคุณกำลังส่งพารามิเตอร์ทั้งหมดของคุณไปยัง URL ค่าที่คั่นด้วยลูกน้ำอาจเป็นตัวเลือกที่ดีที่สุด จากนั้นคุณจะมีเทมเพลต URL ดังต่อไปนี้:
api.com/users?id=id1,id2,id3,id4,id5
…?id=1&id=2&id=3
, มีการรับประกันไม่ว่าพารามิเตอร์การค้นหาที่ซ้ำกันจะถูกรวมเป็นอาร์เรย์ ด้วยสตริงแบบสอบถามดังกล่าวข้างต้น, PHP เกิดขึ้นจะบอกคุณว่าid
เท่ากับ[1, 2, 3]
แต่ Ruby on Rails จะบอกคุณว่ามันเท่ากับ3
และกรอบอื่น ๆ นอกจากนี้ยังอาจทำหน้าที่แตกต่างกันเช่นบอกว่าเท่ากับid
1
URL เช่น…?id=1,2,3
หลีกเลี่ยงปัญหานี้ที่อาจเกิดความสับสน
api.com/users?id=id1,id2,id3,id4,id5
api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5
IMO การโทรข้างต้นดูไม่น่าสนใจ แต่เป็นการแก้ปัญหาที่รวดเร็วและมีประสิทธิภาพ (y) แต่ความยาวของ URL จะถูก จำกัด โดยเว็บเซิร์ฟเวอร์เช่นคราว
ความพยายามอย่างสงบ:
POST http://example.com/api/batchtask
[
{
method : "GET",
headers : [..],
url : "/users/id1"
},
{
method : "GET",
headers : [..],
url : "/users/id2"
}
]
เซิร์ฟเวอร์จะตอบกลับ URI ของทรัพยากรชุดงานที่สร้างขึ้นใหม่
201 Created
Location: "http://example.com/api/batchtask/1254"
ตอนนี้ไคลเอนต์สามารถดึงการตอบสนองแบบแบตช์หรือความคืบหน้าของงานโดยการสำรวจ
GET http://example.com/api/batchtask/1254
นี่คือวิธีที่คนอื่นพยายามแก้ไขปัญหานี้:
@PathParam
ผมพบว่าวิธีการทำในสิ่งเดียวกันโดยใช้อีก นี่คือตัวอย่างโค้ด
@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.
}
เรียกใช้บริการโดยใช้ url ต่อไปนี้
http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76
ที่ไหน
http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76
คุณสามารถสร้าง Rest API หรือโครงการพักผ่อนโดยใช้ ASP.NET MVC และส่งคืนข้อมูลเป็น JSON ตัวอย่างฟังก์ชันคอนโทรลเลอร์จะเป็น:
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));
}
จากนั้นคุณก็เรียกใช้ฟังก์ชัน GetUsers ผ่านฟังก์ชั่น AJAX ปกติที่จัดหาอาร์เรย์ของ Ids (ในกรณีนี้ฉันใช้ jQuery stringify เพื่อส่งอาร์เรย์เป็นสตริงและลดขนาดวัสดุกลับในคอนโทรลเลอร์ แต่คุณสามารถส่งอาร์เรย์ของ ints และรับได้ เป็นอาร์เรย์ของ int ในคอนโทรลเลอร์) ฉันสร้าง Restful API ทั้งหมดโดยใช้ ASP.NET MVC ที่ส่งคืนข้อมูลเป็น json ข้ามโดเมนและสามารถใช้จากแอปใดก็ได้ แน่นอนว่าถ้าคุณสามารถใช้ ASP.NET MVC
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"
});
}