Question

In Magento2 module-customer webapi.xml file, the API GET "/V1/customers/me" has codes below:

<route url="/V1/customers/me" method="GET">
    <service class="Magento\Customer\Api\CustomerRepositoryInterface" method="getById"/>
    <resources>
        <resource ref="self"/>
    </resources>
    <data>
        <parameter name="customerId" force="true">%customer_id%</parameter>
    </data>
</route>

My question is what is the function of the <parameter name="customerId" force="true">%customer_id%</parameter> and how it work?

I tested and found it could pass the customerId to the API method, I need more details about it, so I could use it with confidence in my API, thanks for any explanation :)

Était-ce utile?

La solution

My question is what is the function of the <parameter name="customerId" force="true">%customer_id%</parameter> and how it work?

Magento gets the customer data with passing anything except token value in API call.

In between magento calls some API related controllers for the same

vendor/magento/module-customer/etc/webapi.xml

<route url="/V1/customers/me" method="GET">
        <service class="Magento\Customer\Api\CustomerRepositoryInterface" method="getById"/>
        <resources>
            <resource ref="self"/>
        </resources>
        <data>
            <parameter name="customerId" force="true">%customer_id%</parameter>
        </data>
 </route>

in this API call magento get customer data based on token.

Based on API url url="/V1/customers/me" magento calls function from

Magento calls In-between call of dispatch function.

vendor/magento/module-webapi/Controller/Rest.php

 public function dispatch(\Magento\Framework\App\RequestInterface $request)
 {
     /** In between code **/
     // In the same file
     $this->processApiRequest();

 }
 protected function processApiRequest()
 {
      $inputParams = $this->getInputParamsResolver()->resolve();
 }

And this resolve() function calls override() function

vendor/magento/module-webapi/Controller/Rest/InputParamsResolver.php

 public function resolve()
 {
      $inputData = $this->paramsOverrider->override($inputData, $route->getParameters());
 }

and overide() function calls getOverriddenValue() function

vendor/magento/module-webapi/Controller/Rest/ParamsOverrider.php

 public function override(array $inputData, array $parameters)
 {
      $value = $this->paramOverriders[$paramValue]->getOverriddenValue();
 }

getOverriddenValue() calls ParamOverriderInterface

vendor/magento/framework/Webapi/Rest/Request/ParamOverriderInterface.php

  • To Override parameter values
  • Parameters in the webapi.xml can be forced. This ensures that on specific routes, a specific value is always used.
  • For instance, if there is a ".../me/..." route, the route should use only user information specific to the
  • currently logged in user. More specifically, if there was a "/customers/me/addresses" route, the service method
  • invoked could have a signature of "getAddresses($customerId)", but in the webapi.xml, the $customerId parameter
  • would be forced to be the customer id of the current authenticated user.
  • The forced override parameter configuration is in the webapi.

   <data>
     <parameter name="customer.id" force="true">%customer_id%</parameter>
   </data>

and for business logic of this function is in file -

vendor/magento/module-webapi/Controller/Rest/ParamOverriderCustomerId.php

   /**
    * {@inheritDoc}
    */
   public function getOverriddenValue()
   {
       if ($this->userContext->getUserType() === UserContextInterface::USER_TYPE_CUSTOMER) {
           return $this->userContext->getUserId();
   }
   return null;
   }

So this is how Magento get Customer Id between API calls !!


Another solution

$ch = curl_init('dev.magento2.com/rest/V1/customers/me');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=' . $_COOKIE['PHPSESSID']);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

$json = json_decode($result);
echo $json->id;
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top