Home > Mobile >  Get response of google indexing api in codeigniter
Get response of google indexing api in codeigniter

Time:01-29

I am trying to setup google indexing api in codeigniter, I have done all steps on google cloud and search console part.

It works, but returning success message on all options event when url is not submited, that is why I want to get exact response from google instead of a created success message.

How can I display exact response from google return $stringBody;? or check for the correct response ?

Here is my controller :

namespace App\Controllers;

use App\Models\LanguageModel;
use App\Models\IndexingModel;

class IndexingController extends BaseController
{
    public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
    {
        parent::initController($request, $response, $logger);
        $this->indexingModel = new IndexingModel();
    }
    
    public function GoogleUrl()
    {
        checkPermission('indexing_api');
        $data['title'] = trans("indexing_api");
        $data["selectedLangId"] = inputGet('lang');

        if (empty($data["selectedLangId"])) {
            $data["selectedLangId"] = $this->activeLang->id;
        }

        echo view('admin/includes/_header', $data);
        echo view('admin/indexing_api', $data);
        echo view('admin/includes/_footer');
    }

    /**
     * indexing Tools Post
     */
    public function indexingToolsPost()
    {
      checkPermission('indexing_api');
      $slug = inputPost('slug');
      $urltype = inputPost('urltype');
      $val = \Config\Services::validation();
      $val->setRule('slug', trans("slug"), 'required|max_length[500]');
      if (!$this->validate(getValRules($val))) {
          $this->session->setFlashdata('errors', $val->getErrors());
          return redirect()->to(adminUrl('indexing_api?slug=' . cleanStr($slug)))->withInput();
      } else {
        $this->indexingModel->AddUrlToGoogle($slug, $urltype);
        $this->session->setFlashdata('success', trans("msg_added"));
        resetCacheDataOnChange();
        return redirect()->to(adminUrl('indexing_api?slug=' . cleanStr($slug)));
      }
      $this->session->setFlashdata('error', trans("msg_error"));
      return redirect()->to(adminUrl('indexing_api?slug=' . cleanStr($slug)))->withInput();
    }
}

And This is my model :

namespace App\Models;

use CodeIgniter\Model;
use Google_Client;

class IndexingModel extends BaseModel {
  
  public function AddUrlToGoogle($google_url, $Urltype){
      
    require_once APPPATH . 'ThirdParty/google-api-php-client/vendor/autoload.php';
    
    $client = new Google_Client();
    
    $client->setAuthConfig(APPPATH . 'ThirdParty/google-api-php-client/xxxxxxxxx.json');
    $client->addScope('https://www.googleapis.com/auth/indexing');

    $httpClient = $client->authorize();
    $endpoint = 'https://indexing.googleapis.com/v3/urlNotifications:publish';

    $array = ['url' => $google_url, 'type' => $Urltype];
    $content = json_encode($array);

    $response = $httpClient->post($endpoint,['body' => $content]);
    $body = $response->getBody();
    $stringBody = (string)$body;
        
    return $stringBody;
  }
  
  public function AddUrlToBing($google_url, $Urltype){
      
      
  }
  
  public function AddUrlToYandex($google_url, $Urltype){
      
      
  }
}

This is a success response when I try it out of codeigniter and print_r($stringBody);

{ "urlNotificationMetadata": { "url": "https://example.com/some-text", "latestUpdate": { "url": "https://example.com/some-text", "type": "URL_UPDATED", "notifyTime": "2023-01-29T01:51:13.140372319Z" } } }

And this is an error response :

{ "error": { "code": 400, "message": "Unknown notification type. 'type' attribute is required.", "status": "INVALID_ARGUMENT" } }

But In codeigniter I get a text message "url submited" even if url not submited.

CodePudding user response:

Currently you are not handling the actual response of IndexingModel->AddUrlToGoogle(). It seems your code has a validation before, so it claims, if no validation error occurs, its always a success.

So the first question to ask is, why your validation is not working here - or is it?

Secondly you could handle the actual response in any case:

IndexingController

class IndexingController extends BaseController

    public function indexingToolsPost()
    {
      if (!$this->validate(getValRules($val))) {
          // validation error
          $this->session->setFlashdata('errors', $val->getErrors());
          return redirect()->to(adminUrl('indexing_api?slug=' . cleanStr($slug)))->withInput();
      } else {
        // no validation error
        $apiResponseBody = $this->indexingModel->AddUrlToGoogle($slug, $urltype);
        if(array_key_exists('error', $apiResponseBody)) {
            // its an error!
            // either set the actual messsage
            $this->session->setFlashdata('error', $apiResponseBody['error']['message']);
            // OR translate it
            $this->session->setFlashdata('error', trans($apiResponseBody['error']['message']));
        } else {
           // Its a success!
           $this->session->setFlashdata('success', trans("msg_added"));
        }
        // ...
      }
      return redirect()->to(adminUrl('indexing_api?slug=' . cleanStr($slug)))->withInput();
    }

And in the model, return the response as an array:

IndexingModel

  public function AddUrlToGoogle($google_url, $Urltype) {
    // ...

    $response = $httpClient->post($endpoint,['body' => $content]);
    return json_decode($response->getBody() ?? '', true);   // return an array
  }
  • Related