Rute magento 2 api dengan parameter input

8

Saya mencoba membuat rute api dengan parameter input tapi saya tidak mendapatkan hasil yang diharapkan.

Inilah webapi.xml saya:

<?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>

Di sini antarmuka saya:

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

Dan di sini kelasnya:

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

Saya menghilangkan di.xml dengan preferensi. Sekarang jika saya memanggil rute itu apa pun yang saya lakukan, saya akan dapatkan kembali %id%. Bahkan jika saya tidak memasukkan parameter apa pun, saya mendapatkannya alih-alih kesalahan atau sesuatu.

Apa yang saya lakukan salah di sini?

Ini adalah panggilan di tukang pos: masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Saya mencoba:

  • mengirim permintaan get
  • mengirim permintaan get dengan parameter /order?id=foo
  • mengirim permintaan pos
  • mengirim permintaan posting dengan formulir-data
  • mengirim permintaan pos dengan data mentah (seperti yang terlihat di tangkapan layar)

Semua memiliki hasil yang sama -> %id%

Saya menggunakan edisi komunitas btw.

steros
sumber
Sudahkah Anda menemukan solusi untuk masalahnya? Tolong beri tahu saya bahwa saya menghadapi masalah yang sama, terima kasih
Purushotam Sharma
Maaf meninggalkan perusahaan dan tidak dapat mengakses kode lagi. Saya pikir saya melakukan apa yang saya mulai di komentar terakhir saya di satu-satunya jawaban.
steros

Jawaban:

4

Setelah memeriksa modul inti, ditemukan bahwa parametersimpul di webapi.xml hanya digunakan dalam Modul Pelanggan untuk selfjenis sumber daya.

File di bawah ini bertanggung jawab untuk Mengkonversi placeholder parameter dengan nilai.

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

Sekarang ada dua cara untuk melewatkan parameter di API.

Solusi 1:

webapi.xml seperti di bawah ini:

<?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>

dan tentukan $idargumen di kelas Interface dan dalam definisi implementasi juga. Dalam hal ini, Anda harus memberikan id sebagai konten tubuh.

Solusi 2:

webapi.xml seperti di bawah ini:

<?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>

dan tentukan $idargumen di kelas Interface dan dalam definisi implementasi juga. Dalam hal ini, Anda harus memberikan id di URL sebagai argumen. Untuk ini, Anda dapat memeriksa modul produk juga.

Pankaj Pareek
sumber
Ya itulah yang saya inginkan, untuk membuatnya diperlukan!
steros
Mengapa downvote .. tidak mendapatkan. Saat Anda mendeklarasikan Inerface dengan Argument. Argumen sudah diperlukan. Jika Anda tidak akan menambahkan di webapi.xml. Ini akan berhasil, saya mencoba ini dan itu bekerja dengan baik
Pankaj Pareek
Mungkin tidak jelas? Saya secara khusus ingin menggunakan dataelemen di webapi.xml. Meninggalkannya memberi output yang diharapkan tetapi tidak memecahkan masalah yang sebenarnya.
steros
Ah Anda menuntun saya ke sesuatu: "* Parameter di webapi.xml dapat dipaksakan. Ini memastikan bahwa pada rute tertentu, nilai tertentu selalu digunakan. * Misalnya, jika ada" ... / me / .. rute ", rute harus menggunakan hanya informasi pengguna khusus untuk * pengguna yang sedang login. Lebih khusus lagi, jika ada rute" / pelanggan / saya / alamat ", metode layanan * dipanggil dapat memiliki tanda tangan" getAddresses ( $ customerId) ", tetapi di webapi.xml, parameter $ customerId * akan dipaksa menjadi id pelanggan dari pengguna terotentikasi saat ini."
steros
Ditemukan di ParamOverriderInterface.php - Saya sakit saat ini dan mengalami kesulitan memahami hal-hal tetapi jika saya melakukannya dengan benar di negara ini. Elemen data dan parameter tersebut tidak banyak terkait dengan parameter permintaan. Alih-alih mereka memaksa nilai untuk parameter (dari mana pun itu berasal).
steros