Magento 2에서 사용자 정의 REST API로 JSON 객체를 반환하는 방법은 무엇입니까?


14

사용자 정의 REST API 데모를 작성 중입니다. 이제 데모에서 숫자와 문자열을 반환 할 수 있지만 다른 REST API와 같은 JSON 객체를 반환하려고합니다.

데모에서는 curl을 사용 하여 Magento 2 API (예 : 고객 정보 얻기 : http : //localhost/index.php/rest/V1/customers/1 )를 호출하고 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 \": \ "기본 저장소보기 \", \ "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} "

응답은 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);?
Khoa TruongDinh

예, 시도해
보았습니다.

또 다른 방법을 시도 $json_string = stripslashes($result)하고return json_decode($json_string, true);
코아 TruongDinh에게

답변:


1

우리는 json_encode함께 사용할 수 있습니다 JSON_UNESCAPED_SLASHES:

json_encode($response, JSON_UNESCAPED_SLASHES);

안녕, 그래, 난 내 코드에서 그것을했지만 여전히 슬래시가 있습니다
azol.young

stripslashes()기능이나 시도 했습니까 json_encode($str, JSON_UNESCAPED_SLASHES);?
Khoa TruongDinh

업데이트 된 답변을 읽으십시오.
Khoa TruongDinh

1
$ this-> _ response-> representJson (json_encode ($ data));
Pratik

안녕하세요, 감사합니다! 나는 당신에게 "json_encode ($ response, JSON_UNESCAPED_SLASHES);" and stripslashes ( "hi i \"azol ") ;, 여전히 슬래시가 있습니다 .......
azol.young

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":"...

보시다시피 내 응답에 슬래시가 없습니다.

따라서 두 가지 옵션이 있습니다.

  • cURL 구성이 슬래시로 응답을 리턴하는 이유를 조사하십시오. 아마도 oauth를 사용하는 것과 관련이 있습니까? cURL에서 원시 응답을 얻은 다음 출력과 같은 작업을 수행하고 슬래시를 추가하는 과정에서
  • 슬래시를 사용 str_replace하거나 이와 유사한 것을 제거하는 방법을 찾으십시오 .

슬래시없이 응답을 받으면 다음 한 줄을 사용하여 PHP가 문자열을 JSON 객체로 변환하도록 할 수 있습니다.

$object = json_decode( $output, false, 512, JSON_FORCE_OBJECT);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.