5

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 :)

2
  • I did lot of debugging regarding this :) Commented Sep 25, 2018 at 12:45
  • 1
    @AdityaShah Thank you very much, accept the answer and upvote :)
    – Key Shang
    Commented Sep 26, 2018 at 3:04

1 Answer 1

8

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;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.