2016-05-03 9 views
4

RAMLでいくつかのRESTドキュメントを書いていますが、私は立ち往生しています。RAML:パラメータAのORパラメータを要求する方法B

私の問題: - 私は、パラメータを取ることができ、検索に使用するGETリクエスト「ID」または(排他的または「参照」を持っています。 のいずれか1つだけがである必要があります。

「このパラメータは必須です」とはわかっていますが、「これらのパラメータの1つが必要です」とはどういうふうに言わないのですか?それも可能ですか?

答えて

1

RAML 1.0で書かれた次の例では、UrlFileに2つのオブジェクトタイプを定義し、次いでextUrl OR Fileを必要とする他のオブジェクトItemを作成します。 (現在検証している)インクルードされたサンプルを変更すると、そのプロパティがいずれかの定義に従わない場合に失敗することがわかります。希望が助けてくれる!他の質問があればLMK、私は最善を尽くします。

[編集:ちょうど私があなたの問題を今見ていると思います。should_failという名前の最後の例(この例ではそれぞれのタイプの1つが一緒になっています)が有効であり、検証に失敗します。]

[更新:OK]これを行うにはちょっとした方法がありました。検証中に最後の例を失敗したの下に更新されたコードを参照して、プロパティだけが表示されているはずのオブジェクトでmaxProperties: 1を使用してください。] RAML 0.8で

#%RAML 1.0 
types: 
    Url: 
     properties: 
      url: 
       type: string 
       example: http://www.cats.com/kittens.jpg 
       description: | 
        The url to ingest. 

    File: 
     properties: 
      filename: 
       type: string 
       example: kittens.jpg 
       description: | 
        Name of the file that will be uploaded. 


    Item: 
     description: | 
      An example of a allowing multiple types yet requiring 
      one AND ONLY one of two possible types using RAML 1.0 
     properties: 
      ext: 
       maxProperties: 1 
       type: File | Url 
     examples: 
      file_example: 
       content: 
        ext: 
         filename: video.mp4 
      url_example: 
       content: 
        ext: 
         url: http://heres.a.url.com/asset.jpg 
      should_fail: 
       content: 
        ext: 
         url: http://heres.a.url.com/asset.jpg 
         filename: video.mp4 
+0

ありがとうございます。私はRAML 1.0のタイプに慣れていません(私は今までRAML 0.8を使用していました)。私はそれを読んで、あなたの例をうまく解釈できることを確かめます。 – firetonton

+0

歓迎します。本質的に 'schema'フィールドは廃止され、' type'はそれを置き換えるフィールドです。 docs [here](https://github.com/raml-org/raml-spec/blob/raml-10/versions/raml-10/raml-10.md#type-declarations)を参照してください。 – jfunk

0

あなたが唯一のパラメータでqueryParametersを記述することはできません。

RAML 1.0ではこれを行うことができます。 Typeを記述するには、jsonschemaでoneOfを使用する必要があります。 queryParametersはこのタイプを使用する必要があります。例:

api.raml

#%RAML 1.0 
title: AUTH microservice 
mediaType: application/json 
protocols: [HTTPS] 
types: 
    - example: !include schemas/example.json 
/example: 
    get: 
    queryParameters: 
     type: example 

スキーマ/ example.json

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "id": "file://schemas/credentials.json", 
    "oneOf": [ 
    { 
     "properties": {"key1": {"type": "string"}}, 
     "additionalProperties": false 
    }, 
    { 
     "properties": {"key2": {"type": "string"}}, 
     "additionalProperties": false 
    } 
    ] 
} 

また、あなたがuriParametersを使用することができます。おそらくそれはあなたの場合に役立ちます。

#%RAML 0.8 
title: API Using media type in the URL 
version: v1 
/users{mediaTypeExtension}: 
    uriParameters: 
    mediaTypeExtension: 
     enum: [ .json, .xml ] 
     description: Use .json to specify application/json or .xml to specify text/xml 
1

私は同じ問題がありました。ユーザーは、テキスト入力またはファイル入力のいずれかを提供できますが、両方を提供することはできません。

両方ともフィールドが異なり、フィールド名から要求タイプを検出します。すなわち、要求に[ファイルとパラメータ]がある場合、それはFileInputです。リクエストに[texts and parameters]がある場合、それはTextInputです。同じ要求内でテキストとファイルの両方を提供することはできません。

私はunionプロパティを使用しました。 CatAndDogの例を Raml 200 documentationでご覧ください。 タイプを次のように定義することができます。

types: 
    FileInput: 
    properties: 
     parameters: 
     type: Parameters 
     description: (...) 
     files: 
     type: ArchiveCollection | FileCollection 
     description: (...) 


    TextInput: 
    properties: 
     parameters: 
     type: Parameters 
     description: (...) 

     texts: 
     type: TextCollection 
     description: (...) 

その後、私のPOSTでリクエストボディ:ボディに

/your_route: 
    post: 
    body: 
     multipart/form-data: 
     type: TextInput | FileInput 

フィールドはTextInputコントロールやFileInputクラスのタイプのいずれかで定義されています。

関連する問題