होस्टिंग REST API का इस्तेमाल करके अपनी साइट पर डिप्लॉय करें

Firebase Hosting REST API की मदद से, Firebase पर होस्ट की गई साइटों पर प्रोग्राम के ज़रिए और अपनी पसंद के मुताबिक कॉन्टेंट डिप्लॉय किया जा सकता है. नए या अपडेट किए गए Hosting कॉन्टेंट और कॉन्फ़िगरेशन को डिप्लॉय करने के लिए, इस REST API का इस्तेमाल करें.

डिप्लॉयमेंट के लिए Firebase CLI का इस्तेमाल करने के बजाय, Firebase Hosting REST API का इस्तेमाल करके, प्रोग्राम के ज़रिए अपनी साइट के लिए ऐसेट का नया version बनाया जा सकता है. इसके बाद, इस वर्शन में फ़ाइलें अपलोड की जा सकती हैं. आखिर में, इस वर्शन को अपनी साइट पर डिप्लॉय किया जा सकता है.

उदाहरण के लिए, Firebase Hosting REST API की मदद से, ये काम किए जा सकते हैं:

  • डिप्लॉयमेंट शेड्यूल करना. क्रॉन जॉब के साथ REST API का इस्तेमाल करके, Firebase पर होस्ट किए गए कॉन्टेंट को नियमित तौर पर बदला जा सकता है. उदाहरण के लिए, छुट्टियों या इवेंट से जुड़े कॉन्टेंट का कोई खास वर्शन डिप्लॉय किया जा सकता है.

  • डेवलपर टूल के साथ इंटिग्रेट करना. अपने टूल में एक ऐसा विकल्प बनाया जा सकता है जिससे वेब ऐप्लिकेशन प्रोजेक्ट को सिर्फ़ एक क्लिक करके, Firebase Hosting पर डिप्लॉय किया जा सके. उदाहरण के लिए, किसी IDE में डिप्लॉय बटन पर क्लिक करके.

  • स्टैटिक कॉन्टेंट जनरेट होने पर, डिप्लॉयमेंट की प्रोसेस को ऑटोमेट करना. जब कोई प्रोसेस, प्रोग्राम के ज़रिए स्टैटिक कॉन्टेंट जनरेट करती है, तो जनरेट किए गए कॉन्टेंट को डाइनैमिक तरीके से दिखाने के बजाय, स्टैटिक फ़ाइलों के तौर पर डिप्लॉय किया जा सकता है. उदाहरण के लिए, यूज़र जनरेटेड कॉन्टेंट, जैसे कि विकी या कोई समाचार रिपोर्ट. इससे, आपको ज़्यादा कंप्यूटिंग पावर की ज़रूरत नहीं पड़ती. साथ ही, आपकी फ़ाइलें ज़्यादा बेहतर तरीके से दिखाई जाती हैं.

इस गाइड में सबसे पहले, एपीआई को चालू करने, उसकी पुष्टि करने, और उसे अनुमति देने का तरीका बताया गया है. इसके बाद, इसमें एक उदाहरण दिया गया है. इसकी मदद से, Firebase Hosting वर्शन बनाया जा सकता है, उसमें ज़रूरी फ़ाइलें अपलोड की जा सकती हैं, और आखिर में उस वर्शन को डिप्लॉय किया जा सकता है.

इस REST API के बारे में ज़्यादा जानने के लिए, पूरा Hosting REST API रेफ़रंस दस्तावेज़ पढ़ें.

शुरू करने से पहले: REST API को चालू करना

आपको Google APIs console में, Firebase Hosting REST API को चालू करना होगा:

  1. Google APIs console में, Firebase Hosting API का पेज खोलें.

  2. प्रॉम्प्ट मिलने पर, अपना Firebase प्रोजेक्ट चुनें.

  3. Firebase Hosting API पेज पर, चालू करें पर क्लिक करें.

पहला चरण: एपीआई अनुरोधों की पुष्टि करने और उन्हें अनुमति देने के लिए, ऐक्सेस टोकन पाना

Firebase प्रोजेक्ट, Google के सेवा खातों के साथ काम करते हैं. इनका इस्तेमाल करके, अपने ऐप्लिकेशन सर्वर या भरोसेमंद एनवायरमेंट से, Firebase सर्वर एपीआई को कॉल किया जा सकता है. अगर स्थानीय तौर पर कोड डेवलप किया जा रहा है या अपने ऐप्लिकेशन को कंपनी की इमारत में डिप्लॉय किया जा रहा है, तो सर्वर के अनुरोधों को अनुमति देने के लिए, इस सेवा खाते का इस्तेमाल करके मिले क्रेडेंशियल का इस्तेमाल किया जा सकता है.

अपने Firebase प्रोजेक्ट के सभी सेवा खाते देखने के लिए, सेटिंग सेटिंग > सेवा खाते टैब पर जाएं.

किसी सेवा खाते की पुष्टि करने और उसे Firebase सेवाओं को ऐक्सेस करने की अनुमति देने के लिए, आपको JSON फ़ॉर्मैट में एक निजी पासकोड वाली फ़ाइल जनरेट करनी होगी.

अपने सेवा खाते के लिए, निजी पासकोड वाली फ़ाइल जनरेट करने के लिए:

  1. Firebase कंसोल में, सेटिंग सेटिंग > सेवा खाते टैब पर जाएं.

  2. नया निजी पासकोड जनरेट करें पर क्लिक करें. इसके बाद, पासकोड जनरेट करें पर क्लिक करके पुष्टि करें.

  3. पासकोड वाली JSON फ़ाइल को सुरक्षित तरीके से सेव करें.

अपनी पसंद की भाषा के लिए, Google Auth Library के साथ अपने Firebase क्रेडेंशियल का इस्तेमाल करके, कम समय के लिए मान्य OAuth 2.0 ऐक्सेस टोकन वापस पाएं:

node.js

const {google} = require('googleapis');
function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

इस उदाहरण में, Google API क्लाइंट लाइब्रेरी, JSON वेब टोकन या JWT की मदद से अनुरोध की पुष्टि करती है. ज़्यादा जानकारी के लिए, JSON वेब टोकन देखें.

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

ऐक्सेस टोकन की समयसीमा खत्म होने के बाद, अपडेट किया गया ऐक्सेस टोकन वापस पाने के लिए, टोकन रीफ़्रेश करने का तरीका अपने-आप कॉल हो जाता है.

दूसरा चरण: पक्का करें कि आपके प्रोजेक्ट में डिफ़ॉल्ट Hosting साइट हो

Firebase Hosting पर पहला डिप्लॉयमेंट करने से पहले, आपके Firebase प्रोजेक्ट में डिफ़ॉल्ट Hosting SITE होनी चाहिए.

  1. ` sites.list ` एंडपॉइंट को कॉल करके देखें कि आपके प्रोजेक्ट में पहले से कोई डिफ़ॉल्ट `Hosting` साइट है या नहीं.

    उदाहरण के लिए:

    cURL कमांड

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    

    बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • अगर किसी साइट में "type": "DEFAULT_SITE" है, तो इसका मतलब है कि आपके प्रोजेक्ट में पहले से कोई डिफ़ॉल्ट Hosting साइट है. इस चरण के बाकी हिस्से को छोड़ें, और अगले चरण पर जाएं: अपनी साइट के लिए नया वर्शन बनाना.

    • अगर आपको खाली कलेक्शन मिलता है, तो इसका मतलब है कि आपके पास कोई डिफ़ॉल्ट Hosting साइट नहीं है. इस चरण के बाकी हिस्से को पूरा करें.

  2. अपनी डिफ़ॉल्ट Hosting साइट के लिए, SITE_ID तय करें. SITE_ID तय करते समय, इन बातों का ध्यान रखें:

    • इस SITE_ID का इस्तेमाल करके, Firebase के डिफ़ॉल्ट सबडोमेन बनाए जाते हैं:
      SITE_ID.web.app और SITE_ID.firebaseapp.com.

    • SITE_ID के लिए ये ज़रूरी शर्तें हैं:

      • यह एक मान्य होस्टनेम लेबल होना चाहिए. इसका मतलब है कि इसमें ., _ वगैरह नहीं हो सकते.
      • यह 30 वर्णों या उससे कम का होना चाहिए
      • यह Firebase में दुनिया भर में यूनीक होना चाहिए

    ध्यान दें कि हम अक्सर, आपकी डिफ़ॉल्ट Hostingसाइट के लिए, आपके प्रोजेक्ट आईडी को SITE_ID के तौर पर इस्तेमाल करने का सुझाव देते हैं. यह आईडी ढूंढने का तरीका जानने के लिए, Firebase प्रोजेक्ट के बारे में जानकारी लेख पढ़ें.

  3. अपनी पसंद के SITE_ID को siteId पैरामीटर के तौर पर इस्तेमाल करके, sites.create एंडपॉइंट को कॉल करके, अपनी डिफ़ॉल्ट Hosting साइट बनाएं.

    उदाहरण के लिए:

    cURL कमांड

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    

    बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json

    sites.create को किए गए एपीआई कॉल से यह JSON मिलता है:

    {
      "name": "projects/PROJECT_ID/sites/SITE_ID",
      "defaultUrl": "https://SITE_ID.web.app",
      "type": "DEFAULT_SITE"
    }

तीसरा चरण: अपनी साइट के लिए नया वर्शन बनाना

एपीआई को कॉल करने का आपका पहला मकसद, अपनी साइट के लिए नया Version बनाना है. इस गाइड में आगे, इस वर्शन में फ़ाइलें अपलोड करने और फिर इसे अपनी साइट पर डिप्लॉय करने का तरीका बताया जाएगा.

  1. उस साइट के लिए SITE_ID तय करें जिस पर आपको डिप्लॉय करना है.

  2. कॉल में अपना SITE_ID इस्तेमाल करके, versions.create एंडपॉइंट को कॉल करें.

    (ज़रूरी नहीं) कॉल में, Firebase Hosting कॉन्फ़िगरेशन ऑब्जेक्ट भी पास किया जा सकता है. इसमें, ऐसा हेडर सेट किया जा सकता है जो तय समय के लिए सभी फ़ाइलों को कैश मेमोरी में सेव करता है.

    उदाहरण के लिए:

    cURL कमांड

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
           -d '{
                 "config": {
                   "headers": [{
                     "glob": "**",
                     "headers": {
                       "Cache-Control": "max-age=1800"
                     }
                   }]
                 }
               }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions
    

    बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 134
    
    {
      "config": {
        "headers": [{
          "glob": "**",
          "headers": {
            "Cache-Control": "max-age=1800"
          }
        }]
      }
    }

versions.create को किए गए एपीआई कॉल से यह JSON मिलता है:

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

इस रिस्पॉन्स में, नए वर्शन के लिए यूनीक आइडेंटिफ़ायर होता है. यह इस फ़ॉर्मैट में होता है: sites/SITE_ID/versions/VERSION_ID. इस खास वर्शन को रेफ़र करने के लिए, आपको इस गाइड में इस यूनीक आइडेंटिफ़ायर की ज़रूरत पड़ेगी.

चौथा चरण: डिप्लॉय की जाने वाली फ़ाइलों की सूची तय करना

अब आपके पास नए वर्शन का आइडेंटिफ़ायर है. आपको Firebase Hosting को यह बताना होगा कि आपको इस नए वर्शन में कौनसी फ़ाइलें डिप्लॉय करनी हैं.

ध्यान दें कि Hosting में, अलग-अलग फ़ाइलों के लिए 2 जीबी के साइज़ की सीमा होती है.

इस एपीआई के लिए ज़रूरी है कि फ़ाइलों की पहचान SHA256 हैश से की जाए. इसलिए, एपीआई को कॉल करने से पहले, आपको हर स्टैटिक फ़ाइल के लिए हैश की वैल्यू कैलकुलेट करनी होगी. इसके लिए, फ़ाइलों को Gzip करें. इसके बाद, हर नई कंप्रेस की गई फ़ाइल का SHA256 हैश लें.

अपने उदाहरण को जारी रखते हुए, मान लें कि आपको नए वर्शन में तीन फ़ाइलें डिप्लॉय करनी हैं: file1, file2, और file3.

  1. फ़ाइलों को Gzip करें:

    gzip file1 && gzip file2 && gzip file3

    अब आपके पास तीन कंप्रेस की गई फ़ाइलें हैं: file1.gz, file2.gz, और file3.gz.

  2. हर कंप्रेस की गई फ़ाइल का SHA256 हैश पाएं:

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    अब आपके पास तीन कंप्रेस की गई फ़ाइलों के तीन SHA256 हैश हैं.

  3. एंडपॉइंट versions.populateFiles पर एपीआई अनुरोध में, ये तीनों हैश भेजें. अपलोड की गई फ़ाइल के लिए, हर हैश को मनचाहे पाथ से जोड़ें. इस उदाहरण में, /file1, /file2, और /file3.

    उदाहरण के लिए:

    cURL कमांड

    $ curl -H "Content-Type: application/json" \
             -H "Authorization: Bearer ACCESS_TOKEN" \
             -d '{
                   "files": {
                     "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
                     "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
                     "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
                   }
                 }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles
    

    बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 181
    
    {
      "files": {
        "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
        "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
        "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
      }
    }

versions.populateFiles को किए गए एपीआई कॉल से यह JSON मिलता है:

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files"
}

इस रिस्पॉन्स में ये चीज़ें शामिल हैं:

  • अपलोड की जाने वाली हर फ़ाइल का हैश. उदाहरण के लिए, इस उदाहरण में file1 को पिछले वर्शन में पहले ही अपलोड किया जा चुका था. इसलिए, इसका हैश, uploadRequiredHashes सूची में शामिल नहीं है.

  • uploadUrl, जो नए वर्शन के लिए खास है.

दो नई फ़ाइलें अपलोड करने के अगले चरण में, आपको versions.populateFiles के रिस्पॉन्स से मिले हैश और uploadURL की ज़रूरत पड़ेगी.

पांचवा चरण: ज़रूरी फ़ाइलें अपलोड करना

आपको हर ज़रूरी फ़ाइल को अलग-अलग अपलोड करना होगा. ये वे फ़ाइलें हैं जो पिछले चरण में, versions.populateFiles के रिस्पॉन्स में uploadRequiredHashes में शामिल हैं. इन फ़ाइल अपलोड के लिए, आपको पिछले चरण से मिले फ़ाइल हैश और uploadUrl की ज़रूरत पड़ेगी.

  1. uploadUrl में फ़ॉरवर्ड स्लैश और फ़ाइल का हैश जोड़कर, फ़ाइल के लिए खास यूआरएल बनाएं. यह इस फ़ॉर्मैट में होना चाहिए: https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. अनुरोधों की सीरीज़ का इस्तेमाल करके, सभी ज़रूरी फ़ाइलें एक-एक करके अपलोड करें. इस उदाहरण में, सिर्फ़ file2.gz और file3.gz को फ़ाइल के लिए खास यूआरएल पर अपलोड करें.

    उदाहरण के लिए, कंप्रेस की गई file2.gz को अपलोड करने के लिए:

    cURL कमांड

    curl -H "Authorization: Bearer ACCESS_TOKEN" \
           -H "Content-Type: application/octet-stream" \
           --data-binary @./file2.gz \
    https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH
    

    बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

    Host: upload-firebasehosting.googleapis.com
    
    POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/octet-stream
    Content-Length: 500
    
    content-of-file2.gz

सफलतापूर्वक अपलोड होने पर, 200 OK एचटीटीपीएस रिस्पॉन्स मिलता है.

छठा चरण: वर्शन का स्टेटस, FINALIZED में अपडेट करना

versions.populateFiles के रिस्पॉन्स में शामिल सभी फ़ाइलें अपलोड करने के बाद, अपने वर्शन का स्टेटस FINALIZED में अपडेट किया जा सकता है.

versions.patch एंडपॉइंट को कॉल करें. इसके लिए, एपीआई अनुरोध में status फ़ील्ड को FINALIZED पर सेट करें.

उदाहरण के लिए:

cURL कमांड

curl -H "Content-Type: application/json" \
       -H "Authorization: Bearer ACCESS_TOKEN" \
       -X PATCH \
       -d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status

बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

Host: firebasehosting.googleapis.com

PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23

{"status": "FINALIZED"}

versions.patch को एपीआई कॉल करने पर, यह JSON मिलता है. देखें कि status को FINALIZED में अपडेट किया गया है या नहीं.

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "FINALIZED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  },
  "createTime": "2018-12-02T13:41:56.905743Z",
  "createUser": {
    "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com"
  },
  "finalizeTime": "2018-12-02T14:56:13.047423Z",
  "finalizeUser": {
    "email": "USER_EMAIL@DOMAIN.tld"
  },
  "fileCount": "5",
  "versionBytes": "114951"
}

सातवां चरण: डिप्लॉयमेंट के लिए वर्शन रिलीज़ करना

अब आपके पास फ़ाइनल वर्शन है. इसे डिप्लॉयमेंट के लिए रिलीज़ करें. इस चरण के लिए, आपको अपने वर्शन का Release बनाना होगा. इसमें, होस्टिंग का कॉन्फ़िगरेशन और आपके नए वर्शन की सभी कॉन्टेंट फ़ाइलें शामिल होंगी.

अपना रिलीज़ बनाने के लिए, releases.create एंडपॉइंट को कॉल करें.

उदाहरण के लिए:

cURL कमांड

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID

बिना प्रोसेस किया गया एचटीटीपीएस अनुरोध

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN

releases.create को किए गए एपीआई कॉल से यह JSON मिलता है:

{
  "name": "sites/SITE_ID/releases/RELEASE_ID",
  "version": {
    "name": "sites/SITE_ID/versions/VERSION_ID",
    "status": "FINALIZED",
    "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  }
  },
  "type": "DEPLOY",
  "releaseTime": "2018-12-02T15:14:37Z"
}

होस्टिंग का कॉन्फ़िगरेशन और नए वर्शन की सभी फ़ाइलें अब आपकी साइट पर डिप्लॉय हो जानी चाहिए. साथ ही, इन यूआरएल का इस्तेमाल करके, अपनी फ़ाइलों को ऐक्सेस किया जा सकता है:

  • https://SITE_ID.web.app/file1
  • https://SITE_ID.web.app/file2
  • https://SITE_ID.web.app/file3

आपके SITE_ID.firebaseapp.com डोमेन से जुड़े यूआरएल पर भी इन फ़ाइलों को ऐक्सेस किया जा सकता है.

Firebase Firebaseकंसोल के होस्टिंग Hostingडैशबोर्ड में, अपना नया रिलीज़ भी देखा जा सकता है.