내 프로젝트를위한 REST API를 구축하고 있습니다. 주어진 사용자의 정보를 얻기위한 API는 다음과 같습니다.
api.com/users/[USER-ID]
또한 클라이언트가 사용자 ID 목록을 전달하도록 허용하고 싶습니다. RESTful이되고 사용자 ID 목록을 가져 오도록 API를 어떻게 구성 할 수 있습니까?
내 프로젝트를위한 REST API를 구축하고 있습니다. 주어진 사용자의 정보를 얻기위한 API는 다음과 같습니다.
api.com/users/[USER-ID]
또한 클라이언트가 사용자 ID 목록을 전달하도록 허용하고 싶습니다. RESTful이되고 사용자 ID 목록을 가져 오도록 API를 어떻게 구성 할 수 있습니까?
답변:
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
equals) 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, 위의 호출은 RESTful로 보이지 않지만 빠르고 효율적인 해결 방법입니다 (y). 그러나 URL의 길이는 웹 서버에 의해 제한됩니다 (예 : tomcat) .
RESTful 시도 :
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
이 접근 방식을 선호하는만큼 :-
api.com/users?id=id1,id2,id3,id4,id5
올바른 방법은
api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5
또는
api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5
ASP.NET MVC를 사용하여 Rest API 또는 편안한 프로젝트를 빌드하고 데이터를 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));
}
그런 다음 Ids 배열을 제공하는 일반 AJAX 함수를 통해 GetUsers 함수를 호출합니다 (이 경우 jQuery stringify를 사용하여 배열을 문자열로 보내고 컨트롤러에서 다시 비 물질화하지만 int 배열을 보내고받을 수 있습니다. 컨트롤러에서 int의 배열로). 크로스 도메인 json으로 데이터를 반환하고 모든 앱에서 사용할 수있는 ASP.NET MVC를 사용하여 전체 Restful API를 빌드했습니다. 물론 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"
});
}