Wie erhalte ich eine Antwort von der REST-API im JSON-Format in Magento 2?

Antworten:

14

Unten finden Sie das benutzerdefinierte API-Modul mit dem Schlüsselpaarwert.
Um die JSON-Antwort zu erhalten, setzen Sie im Client die Antwortheader auf"Content-Type: application/json; charset=utf-8"

und wenn Sie einen Schlüsselpaarwert benötigen, der als Antwort verwendet wird, sollten Schlüssel und Wert so sein, wie /rest/V1/categorieswir eine Datenschnittstelle erstellen müssen

Um in Chrome das Download-Plugin namens Rest Client App zu testen, rufen Sie die URL auf

Die folgende Modul-URL lautet http://yourdomein.com/magento2/rest/V1/getinfo

App \ Code \ Sugarcode \ Customapi \ Registrierung.php :

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Sugarcode_Customapi',
    __DIR__
);

app \ code \ Sugarcode \ Customapi \ etc \ module.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Sugarcode_Customapi" setup_version="2.0.0"/>
</config>

app \ code \ Sugarcode \ Customapi \ etc \ di.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">

    <preference for="Sugarcode\Customapi\Api\TestInterface"
                type="Sugarcode\Customapi\Model\Test" />

    <preference for="Sugarcode\Customapi\Api\Data\TestdataInterface" type="Sugarcode\Customapi\Model\Testmodel" />
</config>

app \ code \ Sugarcode \ Customapi \ etc \ 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">

    <!-- Example: curl http://127.0.0.1/index.php/rest/V1/calculator/add/1/2 -->
    <route url="/V1/getinfo" method="GET">
        <service class="Sugarcode\Customapi\Api\TestInterface" method="getinfo" />
        <resources>
            <resource ref="anonymous" />
        </resources>
    </route>

</routes>

app \ code \ Sugarcode \ Customapi \ Api \ TestInterface.php :

<?php

namespace Sugarcode\Customapi\Api;

use Sugarcode\Customapi\Api\Data\TestdataInterface;

interface TestInterface
{
    /**
     * Retrieve list of info
     *
     * @throws \Magento\Framework\Exception\NoSuchEntityException If ID is not found
     * @return \Sugarcode\Customapi\Api\Data\TestdataInterface containing Tree objects
     */
    public function getinfo();

}

Entfernen Sie keine Kommentare, es ist am wichtigsten

app \ code \ Sugarcode \ Customapi \ Api \ Data \ TestdataInterface.php (Daten festlegen und abrufen ):

<?php

namespace Sugarcode\Customapi\Api\Data;

/**
 * @api
 */
interface TestdataInterface
{

    /**
     * Get name
     *
     * @return string
     */
    public function getName();

      /**
     * Set name
     *
     * @param string $name
     * @return $this
     */
    public function setName($id);

}

app \ code \ Sugarcode \ Customapi \ Model \ Test.php :

<?php

namespace Sugarcode\Customapi\Model;

use Sugarcode\Customapi\Api\TestInterface;

/**
 * Defines the implementaiton class of the calculator service contract.
 */
class Test implements TestInterface
{
    /**
     * Return the sum of the two numbers.
     *
     * @api
     * @param int $num1 Left hand operand.
     * @param int $num2 Right hand operand.
     * @return int The sum of the two values.
     */
    protected $dataFactory;
    public function __construct(\Sugarcode\Customapi\Api\Data\TestdataInterfaceFactory $dataFactory)
    {
        $this->dataFactory = $dataFactory;
    }



    public function getinfo() {
        $page_object = $this->dataFactory->create();
        $page_object->setName('Hello');
        return $page_object;        

    }

}

app \ code \ Sugarcode \ Customapi \ Model \ Testmodel.php :

<?php

namespace Sugarcode\Customapi\Model;

class Testmodel extends \Magento\Framework\Model\AbstractModel implements
    \Sugarcode\Customapi\Api\Data\TestdataInterface 
{
    const KEY_NAME = 'name';


     public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = []
    ) {
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
    }


    public function getName()
    {
        return $this->_getData(self::KEY_NAME);
    }


    /**
     * Set name
     *
     * @param string $name
     * @return $this
     */
    public function setName($name)
    {
        return $this->setData(self::KEY_NAME, $name);
    }


}
Pradeep Kumar
quelle
Dies ist bei weitem der beste Weg, um die Antwort von json-Schlüsselwertpaaren zu handhaben. Ich weiß, dass Sie hier eine andere Lösung haben, magento.stackexchange.com/questions/94618/…, aber es scheint kein natürlicher Ansatz zu sein. Vielen Dank.
Hoang Trinh
Dies schafft ein Problem bei der Magento-Upgrade-Zeit
Pushpendra Singh
8

Das Antwortformat (XML oder JSON) wird basierend auf dem AcceptHeader ausgewählt und application/jsonauf der Clientseite festgelegt.

Alex Paliarush
quelle
: - Wenn ich API-URL (Get-Methode) in Browser im XML-Format setzen, gibt es eine Option, um das Antwortformat festzulegen
Pradeep Kumar
Wenn Sie dies nur zu Test- / Entwicklungszwecken benötigen, entfernen Sie alle Renderer mit Ausnahme von JSON in Magento/Webapi/etc/di.xml. Verwenden Sie andernfalls ein Plugin für den Browser, um die richtigen Header festzulegen (z. B. REST-Client für Firefox). Auf jeden Fall ist es möglich, nur auf "anonyme" Ressourcen ohne AuthorizationHeader zuzugreifen .
Alex Paliarush
Ist es obligatorische API / Daten für Knoten, dass ich im Array Ich möchte Schlüsselpaar Wert in diesem Fall, wie mit ohne
Datenordner
1
Ich bin mir nicht sicher, ob ich verstehe, was Sie fragen.
Alex Paliarush
Wenn ich meine API anrufe, brauche ich eine Antwort im Schlüsselwertpaar. Dafür haben sie im Kernmodul eine API / Daten-Schnittstelle geschrieben, ohne dass wir die Antwort mit dem Schlüsselpaarwert wie oben beenden können. Screenshot der Kategorien
Pradeep Kumar
4

Verwenden Sie eine cURL:

    $URL = curl_init( $www );
    curl_setopt( $URL, CURLOPT_HEADER, 0 );
    curl_setopt( $URL, CURLOPT_CUSTOMREQUEST, "GET" );
    curl_setopt( $URL, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $URL, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json",
            "Authorization: Bearer " . $token_API
    ) );

In diesem Schritt zur json_decode()PHP-Funktion gibt der zweite Parameter trueJSON im Array fortmat zurück. Weitere Informationen finden Sie unter: http://php.net/json_decode

$URL = json_decode(curl_exec($URL), true);

Und dann:

curl_close( $URL ); //close cURL conn

print_r( $URL ); //result
Matt Silva
quelle
1
Wie kann ich diese $ token_API des Kunden programmgesteuert abrufen?
Neuling
@Newbie Holen Sie sich ein Admin-Token POST / V1 / Integration / Admin / Token IntegrationAdminTokenServiceV1 Holen Sie sich ein Kunden-Token POST / V1 / Integration / Kunde / Token IntegrationCustomerTokenServiceV1 Wenn Sie dieses Programm erhalten, erstellen Sie ein PHP-Skript und fordern Sie es von der API-URL an. Land Nehmen Sie einen Rückgabewert von WEB API. Schriftart: devdocs.magento.com/guides/v2.0/get-started/authentication/…
Matt Silva
3

Ich würde empfehlen, einen leichten REST-Client über einen Browser zu verwenden. Wenn Sie Chrome installiert haben, installieren Sie einfach die "Postman-Erweiterung". Dort können Sie auswählen, in welcher Darstellung Sie die Antwort sehen möchten. Geben Sie hier die Bildbeschreibung ein

Java_Waldi
quelle