Magento 2でカスタムREST APIを使用してJSONオブジェクトを返す方法は?


14

カスタムREST APIデモを書いています。デモで数字と文字列を返すことができるようになりましたが、他のREST APIのようにJSONオブジェクトを返すようにします。

デモでは、Magento 2 API をcurlで呼び出し(つまり、顧客情報を取得:http://localhost/index.php/rest/V1/customers/1)、curlでJSON文字列を返します。

"{\" id \ ":1、\" group_id \ ":1、\" default_billing \ ":\" 1 \ "、\" created_at \ ":\" 2016-12-13 14:57:30 \ " 、\ "updated_at \":\ "2016-12-13 15:20:19 \"、\ "created_in \":\ "Default Store View \"、\ "email \":\ "75358050@qq.com \ "、\" firstname \ ":\" azol \ "、\" lastname \ ":\" young \ "、\" store_id \ ":1、\" website_id \ ":1、\" addresses \ ":[{ \ "id \":1、\ "customer_id \":1、\ "region \":{\ "region_code \":\ "AR \"、\ "region \":\ "Arad \"、\ "region_id \ ":279}、\" region_id \ ":279、\" country_id \ ":\" RO \ "、\" street \ ":[\" abc \ "]、\" telephone \ ":\" 111 \ "、\"郵便番号\":\"1111 \ "、\" city \ ":\" def \ "、\" firstname \ ":\" azol \ "、\" lastname \ ":\" young \ "、\" default_billing \ ":true}]、 \ "disable_auto_group_change \":0} "

応答はJSON文字列ですが、すべてのキーにはスラッシュが含まれています。でスラッシュを削除できることは知っていますstr_replaceが、それは愚かな方法です。キー内にスラッシュなしでJSONオブジェクトを返す他の方法はありますか?

************ 2016.12.27更新************

ここにテストコードを貼り付けました。

   $method = 'GET';
    $url = 'http://localhost/index.php/rest/V1/customers/1';

    $data = [
        'oauth_consumer_key' => $this::consumerKey,
        'oauth_nonce' => md5(uniqid(rand(), true)),
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_timestamp' => time(),
        'oauth_token' => $this::accessToken,
        'oauth_version' => '1.0',
    ];

    $data['oauth_signature'] = $this->sign($method, $url, $data, $this::consumerSecret, $this::accessTokenSecret);

    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => [
            'Authorization: OAuth ' . http_build_query($data, '', ','),
            'Content-Type: application/json'
        ], 
    ]);

    $result = curl_exec($curl);
    curl_close($curl);

    // this code has slash still
    //return stripslashes("hi i\" azol"); 

    // has slashes still
    //return stripcslashes("{\"id\":1,\"group_id\":1,\"default_billing\":\"1\",\"created_at\":\"2016-12-13 14:57:30\",\"updated_at\":\"2016-12-13 15:20:19\",\"created_in\":\"Default Store View\",\"email\":\"75358050@qq.com\",\"firstname\":\"azol\",\"lastname\":\"young\",\"store_id\":1,\"website_id\":1,\"addresses\":[{\"id\":1,\"customer_id\":1,\"region\":{\"region_code\":\"AR\",\"region\":\"Arad\",\"region_id\":279},\"region_id\":279,\"country_id\":\"RO\",\"street\":[\"abc\"],\"telephone\":\"111\",\"postcode\":\"1111\",\"city\":\"def\",\"firstname\":\"azol\",\"lastname\":\"young\",\"default_billing\":true}],\"disable_auto_group_change\":0}");

    // has slashes still
    //return json_encode(json_decode($result), JSON_UNESCAPED_SLASHES);

    // this code will throw and expcetion:
    // Undefined property: *****\*****\Model\Mycustom::$_response
    //return  $this->_response->representJson(json_encode($data));

    return $result;

試しreturn json_encode($result, JSON_UNESCAPED_SLASHES);ますか?
コアTruongDinh 16

はい、私は「$結果は文字列であるので、それは、例外がスローされます、それを試してみまし
azol.young

:別の方法を試してみてください$json_string = stripslashes($result)return json_decode($json_string, true);
Khoa TruongDinh

回答:


1

私たちは、使用することができますjson_encodeJSON_UNESCAPED_SLASHES

json_encode($response, JSON_UNESCAPED_SLASHES);

やあ、はい、私は私のコードでそれをやったが、それでもスラッシュ持ってきました
azol.young

stripslashes()functionまたはで試しましたかjson_encode($str, JSON_UNESCAPED_SLASHES);
コアTruongDinh 16

更新された回答を読んでください。
コアTruongDinh 16

1
$ this-> _ response-> representJson(json_encode($ data));を試してください。
プラティック16

こんにちはコア、ありがとう!「json_encode($ response、JSON_UNESCAPED_SLASHES);」コードを試してみました and stripslashes( "hi i \" azol ")
;,

1

magento 2のルートディレクトリにws.phpを作成し、以下のコードをファイルに貼り付けます。

<?php
    use Magento\Framework\App\Bootstrap;
    require __DIR__ . '/app/bootstrap.php';
    $params = $_SERVER;
    $bootstrap = Bootstrap::create(BP, $params);


    function sign($method, $url, $data, $consumerSecret, $tokenSecret)
    {
        $url = urlEncodeAsZend($url);
        $data = urlEncodeAsZend(http_build_query($data, '', '&'));
        $data = implode('&', [$method, $url, $data]);
        $secret = implode('&', [$consumerSecret, $tokenSecret]);
        return base64_encode(hash_hmac('sha1', $data, $secret, true));
    }

    function urlEncodeAsZend($value)
    {
        $encoded = rawurlencode($value);
        $encoded = str_replace('%7E', '~', $encoded);
        return $encoded;
    }

    // REPLACE WITH YOUR ACTUAL DATA OBTAINED WHILE CREATING NEW INTEGRATION
    $consumerKey = 'YOUR_CONSUMER_KEY';
    $consumerSecret = 'YOUR_CONSUMER_SECRET';
    $accessToken = 'YOUR_ACCESS_TOKEN';
    $accessTokenSecret = 'YOUR_ACCESS_TOKEN_SECRET';

    $method = 'GET';
    $url = 'http://localhost/magento2/rest/V1/customers/1';

//
$data = [
    'oauth_consumer_key' => $consumerKey,
    'oauth_nonce' => md5(uniqid(rand(), true)),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp' => time(),
    'oauth_token' => $accessToken,
    'oauth_version' => '1.0',
];

$data['oauth_signature'] = sign($method, $url, $data, $consumerSecret, $accessTokenSecret);

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $url,
    CURLOPT_HTTPHEADER => [
        'Authorization: OAuth ' . http_build_query($data, '', ',')
    ]
]);

$result = curl_exec($curl);
curl_close($curl);

echo $result;

$response = \Zend_Json::decode($result);
echo "<pre>";
print_r($response);
echo "</pre>";

この後、ブラウザでhttp://localhost/magento2/ws.phpなどのリンクを使用してこのファイルを実行し、出力を確認します。


1

次のスクリプトを使用して、同じAPI応答でスラッシュが発生するかどうかをテストしてみました。

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.test/rest/all/V1/customers/12408");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer oc34ouc8lvyvxcbn16llx7dfrjygdoh2', 'Accept: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// grab URL and pass it to the browser
$result = curl_exec($ch);

var_dump($result);

// close cURL resource, and free up system resources
curl_close($ch);

これは、この応答を生成します(PHPのvar_dump関数によって切り捨てられます):

$ php -f apitest2.php 
/var/www/html/dfl/htdocs/apitest2.php:14:
string(1120) "{"id":12408,"group_id":13,"default_billing":"544","default_shipping":"544","created_at":"2018-05-24 08:32:59","updated_at":"2018-05-24 08:32:59","created_in":"Default Store View","email":"...

ご覧のとおり、私の応答にスラッシュはありません。

したがって、2つのオプションがあることをお勧めします。

  • cURL構成がスラッシュを含む応答を返す理由を調査します。おそらくそれはoauthの使用と関係があるのでしょうか?何かがcURLから生の応答を取得してから、何かを実行しようとしているようです(出力など)。その過程でスラッシュを追加しています。
  • str_replaceまたはを使用して、スラッシュを削除する方法を見つけてください。

スラッシュなしで応答を取得したら、次の1行を使用して、PHPに文字列をJSONオブジェクトに強制的に変換させることができます。

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.