모범 사례는 무엇인가에서 정의하 soap 서비스(일반 대특정 작업)?
-
05-07-2019 - |
문제
나의 상황은 다음과 같습니다:
나는 정상화 데이터베이스에서,보고는 지리적 정보에 대해 있습니다.구조입니다:
airport --is in--> city --is in--> country --is in--> continent
지금 내가 원하는 사용자가 관리,이 데이터를 제공하지 않고 직접 액세스하는 데이터베이스입니다.우리를 제공 할 필요성이 관리 인터페이스를 통해 웹 서비스입니다.
이제를 설계할 때에는 서비스,우리는 실로 토론을 정의하는 방법에 대한 operations.우리는 서로 다른 솔루션:
솔루션:특정 작업
각각의 네 개의 테이블(공항,도시,국가,대륙)우리는 우리 정의 3 동:
- 삽입
- 을 얻
- 업데이트
이로 이어질 것이라 12 작업 2 요청/응답 개체=24 체
을 만드는 모든 새로운 공항이 모든 종속성을 4 개 이상 요청이 필요합니다.
Solution B:일반
하나만 작업을 통해 제어되는 매개 변수입니다.이 작업할 수 있을 만드는 모든 것을 관리하는 데 필요한 데이터베이스입니다.
작업을 결정할 것이라 무엇을 해야하고 그것을 실행합니다.오류가 발생한 경우 oc cures 이 것,롤 다시 모든 것입니다.
==>1 작업=2 매우 복잡한 요청/응답-체
솔루션 C:중간에 만날 1
하나는 일반적인 작업 테이블당할 수 있는 실행하는 얻을 삽입하고,업데이트하고,그냥 다음과 같 솔루션 B,하지만 하나에 집중하는 테이블이 각.
==>4operations=8 복잡한 요청/응답-체
솔루션 D:중간에 만날 2
하나는 일반적인 작업을 당 작업(get,삽입,삭제),에 작동할 수 있는 각각의 테이블과 해결에 의존한다는 것을 설명합니다.
==>3operations=6 조금 더 복잡한 요청/응답-체
예
이 때문에 오히려 추상적인,hier 간단한 예제 요청에 대한 개체를 위해 만들(JFK 뉴욕/미국/북아메리카):
솔루션:
요청 1/4:
<insertContinent>North America</insertContinent>
요청 2/4:
<insertCountry continent="North America">USA</insertCountry>
요청 3/4:
<insertCity country="USA">New York</insertCity>
요청 4/4:
<insertAirport city="New York">JFK</insertAirport>
Solution B:
요청 1/1:
<action type="insertCountry" parent="North America">USA</action>
<action type="insertAirport" parent="New York">JFK</action>
<action type="insertContinent" parent="">North America</action>
<action type="insertCity" parent="USA">New York</action>
솔루션 C:
요청 1/4:
<countryAction type="insert" parent="North America">USA</countryAction>
요청 2/4:
<airportAction type="insert" parent="New York">JFK</airportAction>
요청 3/4:
<continentAction type="insert" parent="">North America</continentAction >
요청 4/4:
<cityAction type="insert" parent="USA">New York</cityAction >
솔루션 D: 요청 1/1:
<insert airport="JFK" city="New York" country="USA" continent="North America" />
솔루션 D 오스트리아 나를 위해 그러므로 내려 넣고 이에 XSD:
코드:
<complexType name="NewContinent">
<sequence>
<element name="NAME" type="string"></element>
</sequence>
</complexType>
<complexType name="NewCountry">
<sequence>
<element name="ISOCODE" type="string"></element>
<element name="NAME" type="string"></element>
<choice>
<element name="newCONTINENT" type="tns:NewContinent"></element>
<element name="CONTINENT" type="string"></element>
</choice>
</sequence>
</complexType>
<complexType name="NewCity">
<sequence>
<element name="IATA" type="string"></element>
<element name="NAME" type="string"></element>
<choice>
<element name="COUNTRY" type="string"></element>
<element name="newCOUNTRY" type="tns:NewCountry"></element>
</choice>
</sequence>
</complexType>
<complexType name="NewAirport">
<sequence>
<element name="IATA" type="string"></element>
<element name="NAME" type="string"></element>
<choice>
<element name="CITY" type="string"></element>
<element name="newCITY" type="tns:NewCity"></element>
</choice>
</sequence>
</complexType>
해당 요청이 다음과 같습니다:
<complexType name="Request">
<choice>
<element name="AIRPORT" type="tns:NewAirport"></element>
<element name="CITY" type="tns:NewCity"></element>
<element name="COUNTRY" type="tns:NewCountry"></element>
<element name="CONTINENT" type="tns:NewContinent"></element>
</choice>
</complexType>
지금 나의 질문: 이것은 정말 최고의 솔루션을 사용할 수 있습니까?은 XSD 충분히 이해,무엇이 문제인가요?
해결책
아마도 당신이 쓰는 프로토콜 레이어는 것이 이해하는 다른 메시지 유형이 있다.당신은 또한 응용 프로그램이 필요 층 구문 분석하는 내용의 메시지입니다.다른 접근법 당신이 언급할 것이 부담이 없어 분석 이러한 두 개의 층이 있습니다.그래서 예를 들어:
솔루션:프로토콜층은 모든 분석과 데이터를 반환하고 명령입니다.응용 프로그램 계층 사용할 수 있습니다.이것은으로도 알려져 있 RPC 패턴이다.
장점:유효성을 검증할 수 있습니다.할 수 있습지도 메시지를 직접 응용 프로그램 호출합니다.
단점:필요하신 경우에는 변경을 인터페이스 프로토콜 변경합니다.
솔루션 B:프로토콜 층 두 개의 값을 반환합과 등을 명시해주시기 바랍니다.응용 프로그램 레이어야 한 명령을 사용하여 분석하는 값으로 형식입니다.
장점:프로토콜은 결코 변하지 않습니다.
단점:할 수 없습니다 메시지의 유효성을 검사합니다.응용 프로그램 코드가 더 복잡합니다.
솔루션 C:프로토콜 레이어 반환하는 두 가지 알려진 유형과 명령어야 하는 해석됩니다.응용 프로그램 층 수석 명령을 사용하여 데이터입니다.
장점:나는 생각할 수 없다,같이 보이지 않는 아주 좋은 타협이다.
단점:잎 구문 분석하는 부분적으로만 한다.
D 솔루션:프로토콜층 반품 알려진 형식(방법을 구현한다)및 일반적인 명령입니다.응용 프로그램 레이어 봐야에서 받은 데이터로 변환이 일반 명령으로 특정 명령입니다.이와 비슷한 휴식공합니다.
장점:통화가 뚜렷한 운영할 수 있도록 예를 들어 캐시 응답을 얻습니다.
단점:복잡한 응용 프로그램 계층
나머지 모델은 일반적으로 다르게 구현상을 설명한다.사용 HTTP GET,POST,PUT,삭제 메시지 교통하는 임의의 문서입니다.매개변수로 주어진 일부 URL.그래서 예를 들어:
<insert airport="JFK" city="New York" country="USA" continent="North America" />
가
<insert URL="airport?city=Chicago">ORD</insert>
는 경우 또는 HTTP 를 사용하여 그것은 POST 요청하는 공항 URL param 와 도시의 내용에 대한 정보를 공항이 있습니다.참고로 이 중 일부가 명확하게 더 compliated 데이터 수 있는 여러 요소와 혼합한 형식입니다.예를 들어 너를 보내고 싶어서 공항까지 약어 긴 이름 및 고도에 있습니다.
나는 생각한 나머지 건축물 수주에 대한 인터페이스에 대해 설명합니다.만큼 당신이해야 할 모든 당신이 지원 CRUD 작업입니다.이는 많은 사이트를 줄 것이다 당신의 장단점 및 나머지를 건축 스타일입니다.
개인적으로 나아보세요 RPC 스타일(솔루션 A)약간의 휴식-ful 특성이 있습니다.내가 원하는 프로토콜을 구문 분석 작업 확인 메시지입니다.이것은 일반적으로 사람들이 어떻게 구현 SOAP 웹 서비스 인터페이스가 있습니다.
귀하의 인터페이스는 간단한 보일 수 있습니다 오늘 그러나 내일이 하나의 고객을 물어 당신을 위한 새로운 호출에 맞지 않는 나머지는 모델을 잘하고 당신은 자신을 찾을 수 있습니다 쐐기로 기존의 메시지입니다.
다른 팁
이것은 오래된 질문,그리고 나는 확신 서비스의 작성 되었습니다 시간이 오래 전에,하지만 난 기여하고 싶었답니다 어쨌든.
편안한 방법을 정의하는 공항 자원,이와 같은:
<airport href="/airports/JFK">
<name>JFK</name>
<city>New York</city>
<country>USA</country>
<continent>North America</continent>
</airport>
또는,사용하려면 브라우저 호환 마이크로포맷:
<div class="object airport" href="/airports/JFK">
<ul class="attributes">
<li class="name">JFK</li>
<li class="city">New York</li>
<li class="country">USA</li>
<li class="continent">North America</li>
</ul>
</div>
이 리소스가 될 것이에 위치하며 다음과 같 URI /airports/JFK
, 는 것으로 검색 GET
방법,업데이트 PUT
방법으로 삭제 DELETE
방법입니다.
에 디자인이,URI /airports/
는 것을 나타내는 콘테이너를 위한 자원의 모든 공항 데이터베이스에서,그리고 다음과 같 Uri /airports/?city=New+York
고 /airports/?country=USA
것에 대한 필터 컨테이너의 하위 집합을 반환합니다.이들 모두는 것입 GET
방법,그리고 자원을 포함한 목록의 공항 자원 위에서 정의한 대로,중 전체(기 때문에 그들은 작은)또는 몇 가지 유용한 특성과 href
는 전체 리소스에 대한 각 공항이 있습니다.
마지막으로 추가하는 새로운 자원이 될 수 있는 PUT
방법은 공항에서의 전체 URI, POST
방법 /airports/
.두 경우 모두에서 신체의 요청이 공항 자원으로 다음과 같다.의 차이는 방법은 결정하는 것을 얻는 최종 URI 에 대한항:클라이언트을 위한 결정 PUT
그리고 서비스에 대한 결정 POST
.당신이 하나를 사용 여부에 따라 달라집 또는 당신의 클라이언트할 수 있는 합리적으로 결정하는 URI.일반적으로 서비스하기로 결정 때문에 Uri 를 포함하는 숫자 독특한 식별과 서비스를 선택합니다.
지금은 물론의 원래 문제에 대해 비누,지 않은 나머지입니다.나는 가서 설정한 편안한 디자인으로 제가 설명한 다음,설명하는 나의 자원으로 복잡한 형태를 사용하여 XSD 및 비누 서비스와 함께하는 작업을 중복 GET
, PUT
, DELETE
, 고 POST
작업의 편안한 서비스입니다.이것은 당신에게 RPC 동의:
class Airport
has String name
has String city
has String country
has String continent
method void update(name, city, country, continent)
method void delete()
class AirportList
method Airport[] get(opt name, opt city, opt country, opt continent)
method void add(name, city, country, continent)