入力パラメーター付きのmagento 2 apiルート


8

入力パラメーターを使用してAPIルートを作成しようとしていますが、期待した結果が得られません。

これが私のwebapi.xmlです:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
    <route url="/V1/foo" method="POST" secure="true">
        <service class="..\FooInterface"
                 method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
        <data>
            <parameter name="id" force="true">%id%</parameter>
        </data>
    </route>
</routes>

ここに私のインターフェース:

interface FooInterface
{
    /**
     * Test function
     *
     * @api
     * @param string $id
     * @return string
     */
    public function getFooById($id);
}

そしてここにクラス:

class Foo implements FooInterface
{
    /**
     * {@inheritdoc}
     */
    public function getFooById($id){
        return $id;
    }
}

設定でdi.xmlを省略しています。さて、そのルートを呼び出すと、何をしても、返されるのはすべてです%id%。パラメータを何も指定しなくても、エラーや何かの代わりにそれを取得します。

ここで何が悪いのですか?

郵便配達の呼び出しは次のとおりです。 ここに画像の説明を入力してください ここに画像の説明を入力してください

私は試した:

  • getリクエストを送信する
  • パラメータ付きのgetリクエストを送信する /order?id=foo
  • 投稿リクエストを送信する
  • フォームデータを含む投稿リクエストを送信する
  • 生データを含む投稿リクエストを送信する(スクリーンショットに表示)

すべて同じ結果になります-> %id%

コミュニティエディションを使用しています。


彼の問題の解決策を見つけましたか?同じ問題に直面していることをお知らせください。ありがとう
プルショタムシャルマ

会社を辞めて、コードにアクセスできなくなりました。私は最後のコメントで始めたことを唯一の答えでしたと思います。
steros

回答:


4

コアモジュールを確認した後parameter、webapi.xmlのノードはselfリソースタイプのカスタマーモジュールでのみ使用されていることがわかりました。

以下のファイルは、値を持つパラメータープレースホルダーを変換します。

/**
 * Replaces a "%customer_id%" value with the real customer id
 */
Magento\Webapi\Controller\Rest\ParamOverriderCustomerId 

APIでパラメーターを渡す方法は2つあります。

解決策1:

webapi.xml 以下のように:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/foo" method="POST" secure="true">
        <service class="..\FooInterface" method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

また$id、インターフェイスクラスと実装定義でも引数を指定します。この場合、IDを本文コンテンツとして渡す必要があります。

解決策2:

webapi.xml 以下のように:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/foo:id" method="POST" secure="true">
        <service class="..\FooInterface" method="getFooById"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>
</routes>

また$id、インターフェイスクラスと実装定義でも引数を指定します。この場合、IDを引数としてURLに渡す必要があります。これについては、製品モジュールも確認できます。


ええ、まさにそれが必要なのです!
steros 2017

なぜ反対票を投じる..取得できません。あなたがInerface with Argumentを宣言したように。すでに引数が必要です。webapi.xmlに追加しない場合。うまくいく、私はこれを試してみたがうまくいった
パンカジ・パリーク

多分それは明確ではありませんか?具体的にdataは、webapi.xml の要素を使用したいと思います。そのままにしておくと、期待どおりの出力が得られますが、実際の問題は解決されません。
steros 2017

「* webapi.xmlのパラメータを強制できます。これにより、特定のルートで特定の値が常に使用されるようになります。*たとえば、「... / me / .. 。 "ルートでは、ルートは現在ログインしているユーザー*に固有のユーザー情報のみを使用する必要があります。より具体的には、「/ customers / me / addresses」ルートがあった場合、呼び出されたサービスメソッドは*「getAddresses( $ customerId) "ですが、webapi.xmlでは、$ customerIdパラメータ*が現在の認証済みユーザーの顧客IDになるように強制されます。"
steros 2017

ParamOverriderInterface.phpにあります-私は今のところ病気で物事を把握するのに苦労していますが、この状態でうまくいけば。これらのデータおよびパラメーター要素は、要求パラメーターとはあまり関係がありません。代わりに、パラメーターの値を強制します(どこからでも)。
steros 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.