「Magento 2での新しいREST Webサービスの作成」および「Magento 2での新しいREST Webサービスの作成」のリソースを使用してカスタムAPIモジュールを作成しましたが、応答はXML形式です。キーと値のペアを含むJSON形式の応答が必要です。これどうやってするの?
「Magento 2での新しいREST Webサービスの作成」および「Magento 2での新しいREST Webサービスの作成」のリソースを使用してカスタムAPIモジュールを作成しましたが、応答はXML形式です。キーと値のペアを含むJSON形式の応答が必要です。これどうやってするの?
回答:
以下は、キーペア値
を持つカスタムAPIモジュールです。JSON応答を取得するには、クライアントで応答ヘッダーを設定します"Content-Type: application/json; charset=utf-8"
そして、あなたが応答しているキーペアの値が必要な場合は、/rest/V1/categories
データインターフェイスを作成する必要があるようなキーと値が必要です
レストクライアントアプリと呼ばれるChromeダウンロードプラグインをテストするには、URLを呼び出します
モジュールのURLの下はhttp://yourdomein.com/magento2/rest/V1/getinfoになります
app \ code \ Sugarcode \ Customapi \ registration.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();
}
最も重要なコメントを削除しないでください
app \ code \ Sugarcode \ Customapi \ Api \ Data \ TestdataInterface.php(データの設定と取得):
<?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);
}
}
Accept
ヘッダーに基づいて応答形式(XMLまたはJSON)が選択さapplication/json
れ、クライアント側で設定されます。
Magento/Webapi/etc/di.xml
。それ以外の場合は、ブラウザのプラグインを使用して適切なヘッダーを設定します(FirefoxのRESTクライアントなど)。とにかく、Authorization
ヘッダーなしで「匿名」リソースのみにアクセスすることが可能です。
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
) );
json_decode()
PHP関数のこのステップでは、2番目のtrue
パラメーターがJSONを配列fortmatに返します。詳細については、http://php.net/json_decodeを参照してください。
$URL = json_decode(curl_exec($URL), true);
その後:
curl_close( $URL ); //close cURL conn
print_r( $URL ); //result