3

簡単に思えることをやろうとしていますが、うまくいきません。基本的には、WSO2 API マネージャーに URL パラメーターを REST 呼び出しに追加してもらいたいと考えています。

セットアップと問題

WSO2 API マネージャーがインストールされています。また、 someservletと呼ばれる偽のサーブレットで実行されている Tomcat もあります。サーブレットをマネージャーに API として追加したので、サーブレットを直接呼び出すか、WSO2 API マネージャーを介して呼び出すことができます。

走れる

curl http://localhost:8080/someservlet/servlet/toto?blob=blib&secret=pass

サーブレットは正常に動作し、パス/totoとパラメーターblobおよびsecretを受信したことがわかります。

走れる

curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib&secret=pass"

そして、それはまったく同じことをします。ここまでは順調ですね。

私が欲しいのは実行することです:

curl -H "Authorization: Bearer MqVQuHqLNphtPV3XF1CtXVmbyP8a" --url "http://192.168.23.1:8280/someservlet/1.0/toto?blob=blib"

(シークレットパラメータを削除したことに注意してください)

...それでも同じ結果が得られます。

したがって、基本的には API マネージャーに URL パラメーターsecret=passを追加してもらいたいと考えています。

最初に試したこと:プロパティメディエーター

プロパティ REST_URL_POSTFIXで Synapse XML構成を使用します。

API構成ファイルを編集し、追加しました

<property name="REST_URL_POSTFIX" value="/blob?toto=titi" scope="axis2" type="STRING"/>

今私が走れば

curl -H "Authorization: Bearer [...]" --url "http://192.168.23.1:8280/someservlet/1.0/toti?blab=blib&secret=puss"

someservlet/1.0/blob?toto=titiを実行したかのようです:すべてのパスとパラメーターが消え、構成されたものに置き換えられました。ねえ、それがうまくいくはずですよね!

問題:

  1. これは URL に何かを追加するのではなく、URL の接尾辞を設定します。つまり、既存のパラメーターが消えます (上記の例ではblab=blib ) 。
  2. 有効な値になるには「/」で始まる必要があるため、 &secret=pass を追加することはできません(もちろん、問題 1 のため、これはとにかく役に立たないでしょう)。

したがって、基本的にこれでは、最後の&secret=passを追加できません。

2 番目に試したこと: URL メディエーターを書き換える

私はこのメディエーターを見つけました。おそらくうまくいかないかもしれませんが、良いリードです: secret=fooで呼び出すだけで、メディエーターにそれをsecret=passに置き換えることができます。

これを設定ファイルに入れました:

<rewrite>
  <rewriterule>
    <action type="replace" value="pass" fragment="query" regex="foo"/>
  </rewriterule>
</rewrite>

これはうまくいきません。最初は、アクション パラメータが正しくないと思いました。しかし、エラーメッセージは次のとおりです。

Malformed URL when processing /someservlet/1.0/toti?blab=blib&amp;secret=foo

奇形?例外スタック トレースに詳細があります。

java.net.MalformedURLException: no protocol: /someservlet/1.0/toti?blab=blib&secret=foo

つまり、メディエーター (ログまたはリライト) は、"To:"フィールドがプロトコルのない URL を指しているメッセージを受信します。

もちろん、私はグーグルで検索してきましたが、他の人がlogMediator: To: /blabla を持っていることを発見した場合や、 logMediator: To: http ://blabla を持っている他の (ほとんどの) ケースがあります。何が違いを引き起こしているのか、私にはよくわかりません。:-(

だから、これは私が立ち往生しているところです!! :-(

試すオプション

おそらくうまくいくはずのハンマーソリューションがあることを私は知っています:

  1. プロパティを使用して、完全なパスとすべてのパラメーターを保存します
  2. これらのパラメーターを変更するために、独自のメディエーターを (Java などで) 実装します。
  3. プロパティ REST_URL_POSTFIXを使用して、変更された接尾辞を呼び出しに配置します

ただし、この問題にはもっと簡単な解決策が必要だと思います。

私が見つけていない単純なリソース (メディエーター、サンプル、構文エラーなど) を誰かが教えてくれることを期待しています。楽観主義... :-)

読んでくれてありがとう。何か案は?

4

3 に答える 3

1

問題を解決しました。

これが私がすることです:

  1. 構成ファイルで、REST_URL_POSTFIXを使用して URL の接尾辞を取得し、それをプロパティに配置します。
  2. Java メディエータでプロパティを編集する
  3. REST_URL_POSTFIXを使用して XML で新しい接尾辞を設定します

最初のステップでは、次の行を使用します。

<property name="querystrings" expression="get-property('axis2', 'REST_URL_POSTFIX')"/>

私にとってはうまくいかない行がたくさんあるので、これを解決するのに少し時間がかかりました.2つのパラメータ(axis2とREST ...)を使ってまっすぐにしました。

2 番目のステップの構成 XML は次のとおりです。

<class name="mypackage.AddUrlParamMediator">
    <property name="paramName" value="mykey"/>
    <property name="paramValue" value="mysecret"/>
</class>

これはメディエーター クラスです (インポートなし):

public class AddUrlParamMediator extends AbstractMediator {
    private String paramName = "default";
    private String paramValue = "default";

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    public void setParamValue(String paramValue) {
        this.paramValue = paramValue;
    }

    public boolean mediate(MessageContext synapseMsgContext) {
        SynapseLog log = this.getLog(synapseMsgContext);
        String urlNewParam = this.paramName + "=" + this.paramValue;
        Object queryStringsPpty = synapseMsgContext.getProperty("querystrings");
        if (queryStringsPpty == null) {
            log.error("### queryStringPpty=null, exiting!");
            return true;
        }
        String queryStrings = queryStringsPpty.toString();
        queryStrings = (queryStrings.contains("?"))
            ? queryStrings + "&" + urlNewParam
            : queryStrings + "?" + urlNewParam;
        synapseMsgContext.setProperty("querystrings", queryStrings);
        return true;
    }
}

そしてもちろん、XML 構成の 3 番目のステップは次のとおりです。

<property name="REST_URL_POSTFIX" expression="get-property('querystrings')" scope="axis2" type="STRING"/>

したがって、これらすべては基本的に URL の末尾にパラメーターを設定します。これが他の人に役立つことを願っています。

于 2013-02-08T15:00:48.403 に答える
1

私が理解しているsecret=passように、エンドポイントの URL に を追加しようとしています。API を呼び出すと、そのパラメーターを送信していると思います。同時に"blab=blib"パラメータも送信しています。しかし、ESB では、それを次のように変更する必要があります。"toto=titi"

使用した方法は正しいです(つまり、プロパティを使用するREST_URL_POSTFIX)その場合、すべての requets パラメータを置き換えます。ただし、それを使用する前に、要求パラメーターを保存し、"REST_URL_POSTFIX" 必要な最終的な REST URL を使用して取得できます。(はい、それはあなたが「試してみる」と述べた最後のオプションです)「TO」アドレスでは、ポート番号の後にアドレスしかありません。"" POST_TO_URI"プロパティyopuを使用すると、完全なアドレスURLがログに出力されますが、BEサービスとESBの間にプロキシサーバーが構成されている場合はそれを使用します

于 2013-01-28T06:25:46.473 に答える
0

同じ問題を抱えている可能性のある人のために、よりシンプルで機能する別の解決策を次に示します。

Carbon 管理ポータルの API のリストに移動し、関連する API を見つけてクリックします。これは、API の XML 構成につながります。「住所」フィールドの後 (および XML の同じレベル) に次のフィールドを追加します。

<property name="Authorization" value="stuff to add" scope="transport"/>

これにより、プロパティ「Authorization」が値「stuff」で追加されます。

于 2014-09-11T10:51:35.160 に答える