모범 사례는 무엇인가에서 정의하 soap 서비스(일반 대특정 작업)?

StackOverflow https://stackoverflow.com/questions/180572

  •  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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top