Why ‘do_shortcode’ doesn’t work in a REST request?

Solution

I find a workaround for this issue. I post it for posterity.

This is an issue, several issue, between divi and REST Api.

In the exemple bellow, register_rest_field is used instead of register_rest_route, but the fix is valid for both method.

This solution could not be very futureproof. But, at least, their is no modification inside Divi Builder or Rest API.

/*
     Edit Rest call
*/
add_action( 'rest_api_init', function ()
{
   register_rest_field(
          'page',
          'content',
          array(
                 'get_callback'    => 'duo_get_divi_content',
                 'update_callback' => null,
                 'schema'          => null,
          )
       );
});

function duo_get_divi_content( $object, $field_name, $request )
{
   //Set is_singular to true to ovoid "read more issue"
   //Issue come from is_singular () in divi-builder.php line 73
   global $wp_query;
   $wp_query->is_singular = true;


   //Set divi shortcode
   //The 2 function bellow are define in 'init' but they are call in 'wp'
   //REST Api exit after 'parse_request' hook, it's before 'wp' so divi's shortcode are not set
   et_builder_init_global_settings ();
   et_builder_add_main_elements ();


   //Define $post, if not defined, divi will not add outter_content and inner_content warper
   //Issue come from get_the_ID() in divi-builder.php line 69
   global $post;
   $post = get_post ($object['id']);

   //Apply the_content's filter, one of them interpret shortcodes
   $output =  apply_filters( 'the_content', $post->post_content );

   return $output;
}