Web-приложение на c/c++ с помощью fastcgi

Введение в Web API

Последнее обновление: 31.10.2015

Одним из преимуществ стека технологий на платформе .NET является возможность создания сервисов. Так, в ASP.NET мы могли создавать ASMX-веб-службы. Кроме того, мы можем использовать более функциональную в этом плане технологию WCF для создания веб-служб.

Но с последним релизом MVC 4 и вообще всей платформы .NET 4.5 в нашем распоряжении оказался еще один инструмент для создания веб-служб — Web API. Концепция Web API (которую кстати можно использовать не только в MVC, но и в веб-формах) новый подход к реализации веб-приложений.

Создадим простое приложение ASP.NET MVC 4, указав в качестве шаблона проекта Web API:


Среда создаст обычный mvc-проект со стандартной структурой. По умолчанию нам будет создано два контроллера. Один из них стандартный контроллер HomeController. Второй контроллер — ValuesController, который и реализует функционал Web API:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post(string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

Как видно, определение контроллера Web API отличается от обычного контроллера. Во-первых, он образован от класса , который не связан с базовым классом обычных контроллеров —

Во-вторых, контроллеры Web API применяют стиль REST. Вообще поддержка архитектуры REST (Representation State Transfer или «передача состояния представления») является одним из основных узловых пунктов технологии Web API.

Для взаимодействия с сервером в REST-архитектуре используются методы HTTP:

  • GET

  • POST

  • PUT

  • DELETE

У нас тут нет обычных методов действий, как в традиционных контроллерах, которые возвращают ActionResult. А определенные в контроллере ValuesContoller методы сопоставляются с одноименными методами HTTP.

Маршрутизация в Web API

Поскольку в Web API методы контроллера не являются прямыми ресурсами и сопоставляются с методами HTTP, то и весь механизм маршрутизации действует не как при определении обычных маршрутов. Все определения маршрутов для Web API находятся в файле WebApiConfig.cs (в папке App_Start):

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

В данном случае определен один маршрут, где в качестве второго параметра выступает контроллер, а третий необязательный параметр представляет некоторый идентификатор. Таким образом, в отличие от маршрутов обычных контроллеров у нас здесь нет действия, только контроллер и дополнительный необязательный параметр

В итоге обращение api/values будет соответствовать обращению к контроллеру ValuesCotroller, причем почти ко всем действиям сразу (кроме Get(int id) — так как в данном случае необходим еще идентификатор, например api/values/2)

Но, как уже выше говорилось, в зависимости от использованного метода HTTP фреймворк будет различать к какому именно действию относится текущий запрос.

Так, например, запрос GET api/values будет сопоставлен с методом и вернет в ответ браузеру коллекцию элементов .

Если же сервер получит запрос PUT с адресом api/values, то такой запрос будет сопоставлен с методом Put.

А запросу GET api/values/7 будет соответствовать метод , так как этот метод принимает параметр.

Условности при наименовании методов

При создании методов контроллера Web API действует некоторые условности. Так, имена методов по умолчанию должны начинаться с имени предназначенного для них метода HTTP. В случае с контроллером по умолчанию все просто: все методы действий носят названия методов HTTP.

Однако мы можем использовать и любые другие имена без префиксов, но в этом случае нам надо будет явно указать метод HTTP в виде атрибута, например:

public class ValuesController : ApiController
{
	public IEnumerable<string> GetAllItems()
    {
        return new string[] { "value1", "value2" };
    }

    public string GetItem(int id)
    {
        return "value";
    }

	
    public void CreateItem(string value)
    {
    }

    
    public void EditItem(int id, string value)
    {
    }

    
    public void RemoveItem(int id)
    {
    }
}

Таким образом, если первые два действия соответствуют соглашениям о наименовании (в начале содержат название метода HTTP), то к остальным мы применяем атрибуты, чтобы система знала, с каким методом надо сопоставлять запрос.

НазадВперед

HTTP Header

The line Content-type:text/html\r\n\r\n is a part of HTTP header, which is sent to the browser to understand the content. All the HTTP header will be in the following form −

HTTP Field Name: Field Content
 
For Example
Content-type: text/html\r\n\r\n

There are few other important HTTP headers, which you will use frequently in your CGI Programming.

Sr.No Header & Description
1

Content-type:

A MIME string defining the format of the file being returned. Example is Content-type:text/html.

2

Expires: Date

The date the information becomes invalid. This should be used by the browser to decide when a page needs to be refreshed. A valid date string should be in the format 01 Jan 1998 12:00:00 GMT.

3

Location: URL

The URL that should be returned instead of the URL requested. You can use this filed to redirect a request to any file.

4

Last-modified: Date

The date of last modification of the resource.

5

Content-length: N

The length, in bytes, of the data being returned. The browser uses this value to report the estimated download time for a file.

6

Set-Cookie: String

Set the cookie passed through the string.

Service Requestor or Consumer

This is any consumer of the web service. The requestor utilizes an existing web service by opening a network connection and sending an XML request.

We will also write two web service requestors: one web-based consumer (ASP.NET application) and another Windows application-based consumer.

Given below is our first web service example which works as a service provider and exposes two methods (add and SayHello) as the web services to be used by applications. This is a standard template for a web service. .NET web services use the .asmx extension. Note that a method exposed as a web service has the WebMethod attribute. Save this file as FirstService.asmx in the IIS virtual directory (as explained in configuring IIS; for example, c:\MyWebSerces).

FirstService.asmx
<%@ WebService language = "C#" class = "FirstService" %>

using System;
using System.Web.Services;
using System.Xml.Serialization;

[WebService(Namespace = "http://localhost/MyWebServices/")]
public class FirstService : WebService{
   
   public int Add(int a, int b) {
      return a + b;
   }

   
   public String SayHello() {
      return "Hello World";
   }
}

To test a web service, it must be published. A web service can be published either on an intranet or the Internet. We will publish this web service on IIS running on a local machine. Let us start with configuring the IIS.

  • Open Start → Settings → Control Panel → Administrative tools → Internet Services Manager.

  • Expand and right-click on the default web site; select New rarr; Virtual Directory. The Virtual Directory Creation Wizard opens. Click Next.

  • The «Virtual Directory Alias» screen opens. Type the virtual directory name. For example, MyWebServices. Click Next.

  • The «Web Site Content Directory» screen opens.

  • Enter the directory path name for the virtual directory. For example, c:\MyWebServices. Click Next.


  • The «Access Permission» screen opens. Change the settings as per your requirements. Let us keep the default settings for this exercise.

  • Click the Next button. It completes the IIS configuration.

  • Click Finish to complete the configuration.

To test whether the IIS has been configured properly, copy an HTML file (For example, x.html) in the virtual directory (C:\MyWebServices) created above. Now, open Internet Explorer and type http://localhost/MyWebServices/x.html. It should open the x.html file.

Note − If it does not work, try replacing the localhost with the IP address of your machine. If it still does not work, check whether IIS is running; you may need to reconfigure the IIS and the Virtual Directory.

To test this web service, copy FirstService.asmx in the IIS virtual directory created above (C:\MyWebServices). Open the web service in Internet Explorer (http://localhost/MyWebServices/FirstService.asmx). It should open your web service page. The page should have links to two methods exposed as web services by our application. Congratulations! You have written your first web service!

Service Requestor or Consumer

This is any consumer of the web service. The requestor utilizes an existing web service by opening a network connection and sending an XML request.

We will also write two web service requestors: one web-based consumer (ASP.NET application) and another Windows application-based consumer.

Given below is our first web service example which works as a service provider and exposes two methods (add and SayHello) as the web services to be used by applications. This is a standard template for a web service. .NET web services use the .asmx extension. Note that a method exposed as a web service has the WebMethod attribute. Save this file as FirstService.asmx in the IIS virtual directory (as explained in configuring IIS; for example, c:\MyWebSerces).

FirstService.asmx
<%@ WebService language = "C#" class = "FirstService" %>

using System;
using System.Web.Services;
using System.Xml.Serialization;

[WebService(Namespace = "http://localhost/MyWebServices/")]
public class FirstService : WebService{
   
   public int Add(int a, int b) {
      return a + b;
   }

   
   public String SayHello() {
      return "Hello World";
   }
}

To test a web service, it must be published. A web service can be published either on an intranet or the Internet. We will publish this web service on IIS running on a local machine. Let us start with configuring the IIS.

  • Open Start → Settings → Control Panel → Administrative tools → Internet Services Manager.

  • Expand and right-click on the default web site; select New rarr; Virtual Directory. The Virtual Directory Creation Wizard opens. Click Next.

  • The «Virtual Directory Alias» screen opens. Type the virtual directory name. For example, MyWebServices. Click Next.

  • The «Web Site Content Directory» screen opens.

  • Enter the directory path name for the virtual directory. For example, c:\MyWebServices. Click Next.

  • The «Access Permission» screen opens. Change the settings as per your requirements. Let us keep the default settings for this exercise.

  • Click the Next button. It completes the IIS configuration.

  • Click Finish to complete the configuration.

To test whether the IIS has been configured properly, copy an HTML file (For example, x.html) in the virtual directory (C:\MyWebServices) created above. Now, open Internet Explorer and type http://localhost/MyWebServices/x.html. It should open the x.html file.

Note − If it does not work, try replacing the localhost with the IP address of your machine. If it still does not work, check whether IIS is running; you may need to reconfigure the IIS and the Virtual Directory.

To test this web service, copy FirstService.asmx in the IIS virtual directory created above (C:\MyWebServices). Open the web service in Internet Explorer (http://localhost/MyWebServices/FirstService.asmx). It should open your web service page. The page should have links to two methods exposed as web services by our application. Congratulations! You have written your first web service!

How To Do It

Here is the code to add the Web Service to a web page:

<form action=’tempconvert.asmx/FahrenheitToCelsius’ method=»post» target=»_blank»> <table>   <tr>     <td>Fahrenheit to Celsius:</td>     <td>     <input class=»frmInput» type=»text» size=»30″ name=»Fahrenheit»>     </td>   </tr>   <tr>     <td></td>     <td align=»right»>      <input type=»submit» value=»Submit» class=»button»>      </td>   </tr> </table> </form> <form action=’tempconvert.asmx/CelsiusToFahrenheit’ method=»post» target=»_blank»> <table>   <tr>     <td>Celsius to Fahrenheit:</td>     <td>     <input class=»frmInput» type=»text» size=»30″ name=»Celsius»>     </td>   </tr>   <tr>     <td></td>     <td align=»right»>     <input type=»submit» value=»Submit» class=»button»>     </td>   </tr> </table> </form>

Substitute the «tempconvert.asmx» with the address of your web service like:

http://www.example.com/xml/tempconvert.asmx

Типы файлов WSDL

Ассоциация основного файла WSDL

.WSDL

Формат файла: .wsdl
Тип файла: Web Services Description Language File

Суффикс WSDL Файл в основном связан с информационным файлом, который используется в Visual Studio, которая является интегрированной IDE от Microsoft. Файл WSDL записывается в Web Services Description Language, который является XML-язык для описания веб-служб и доступ к ним. WSDL файлы описывают такую ​​информацию, как типы, сообщений, операции и протоколы, используемые службой.

Создатель: Microsoft Corporation
Категория файла: Веб-файлф
Ключ реестра: HKEY_CLASSES_ROOT\.wsdl

Программные обеспечения, открывающие Web Services Description Language File:

Microsoft Visual Studio, разработчик — Microsoft Corporation

Совместимый с:

Windows

Oxygen XML Editor 19, разработчик — Syncro Soft

Совместимый с:

Windows
Mac
Linux

Liquid Technologies Liquid XML Studio, разработчик — Liquid Technologies

Совместимый с:

Windows

Passing Information Using POST Method

A generally more reliable method of passing information to a CGI program is the POST method. This packages the information in exactly the same way as GET methods, but instead of sending it as a text string after a ? in the URL it sends it as a separate message. This message comes into the CGI script in the form of the standard input.

The same cpp_get.cgi program will handle POST method as well. Let us take same example as above, which passes two values using HTML FORM and submit button but this time with POST method as follows −

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br />
   Last Name: <input type = "text" name = "last_name" />
 
   <input type = "submit" value = "Submit" />
</form>

Here is the actual output of the above form. You enter First and Last Name and then click submit button to see the result.

Web Services have Two Types of Uses

Reusable application-components.

There are things applications need very often. So why make these over and over again?

Web services can offer application-components like: currency conversion, weather reports, or even language translation as services.


Connect existing software.

Web services can help to solve the interoperability problem by giving different applications a way to link their data.

With Web services you can exchange data between different applications and different platforms.

Any application can have a Web Service component.

Web Services can be created regardless of programming language.

Устранение неполадок при открытии файлов WSDL

Общие проблемы с открытием файлов WSDL

Microsoft Visual Studio не установлен

Дважды щелкнув по файлу WSDL вы можете увидеть системное диалоговое окно, в котором сообщается «Не удается открыть этот тип файла». В этом случае обычно это связано с тем, что на вашем компьютере не установлено Microsoft Visual Studio для %%os%%. Так как ваша операционная система не знает, что делать с этим файлом, вы не сможете открыть его дважды щелкнув на него.

Совет: Если вам извстна другая программа, которая может открыть файл WSDL, вы можете попробовать открыть данный файл, выбрав это приложение из списка возможных программ.

Установлена неправильная версия Microsoft Visual Studio

В некоторых случаях у вас может быть более новая (или более старая) версия файла Web Services Description Language File, не поддерживаемая установленной версией приложения. При отсутствии правильной версии ПО Microsoft Visual Studio (или любой из других программ, перечисленных выше), может потребоваться загрузить другую версию ПО или одного из других прикладных программных средств, перечисленных выше. Такая проблема чаще всего возникает при работе в более старой версии прикладного программного средства с файлом, созданным в более новой версии, который старая версия не может распознать.

Совет: Иногда вы можете получить общее представление о версии файла WSDL, щелкнув правой кнопкой мыши на файл, а затем выбрав «Свойства» (Windows) или «Получить информацию» (Mac OSX).

Резюме: В любом случае, большинство проблем, возникающих во время открытия файлов WSDL, связаны с отсутствием на вашем компьютере установленного правильного прикладного программного средства.

Даже если на вашем компьютере уже установлено Microsoft Visual Studio или другое программное обеспечение, связанное с WSDL, вы все равно можете столкнуться с проблемами во время открытия файлов Web Services Description Language File. Если проблемы открытия файлов WSDL до сих пор не устранены, возможно, причина кроется в других проблемах, не позволяющих открыть эти файлы. Такие проблемы включают (представлены в порядке от наиболее до наименее распространенных):

Example

Consider a simple account-management and order processing system. The accounting personnel use a client application built with Visual Basic or JSP to create new accounts and enter new customer orders.

The processing logic for this system is written in Java and resides on a Solaris machine, which also interacts with a database to store information.

The steps to perform this operation are as follows −

  • The client program bundles the account registration information into a SOAP message.

  • This SOAP message is sent to the web service as the body of an HTTP POST request.

  • The web service unpacks the SOAP request and converts it into a command that the application can understand.

  • The application processes the information as required and responds with a new unique account number for that customer.

  • Next, the web service packages the response into another SOAP message, which it sends back to the client program in response to its HTTP request.

  • The client program unpacks the SOAP message to obtain the results of the account registration process.

CGI Environment Variables

All the CGI program will have access to the following environment variables. These variables play an important role while writing any CGI program.

Sr.No Variable Name & Description
1

CONTENT_TYPE

The data type of the content, used when the client is sending attached content to the server. For example file upload etc.

2

CONTENT_LENGTH

The length of the query information that is available only for POST requests.

3

HTTP_COOKIE

Returns the set cookies in the form of key & value pair.

4

HTTP_USER_AGENT

The User-Agent request-header field contains information about the user agent originating the request. It is a name of the web browser.

5

PATH_INFO

The path for the CGI script.

6

QUERY_STRING

The URL-encoded information that is sent with GET method request.

7

REMOTE_ADDR

The IP address of the remote host making the request. This can be useful for logging or for authentication purpose.

8

REMOTE_HOST

The fully qualified name of the host making the request. If this information is not available then REMOTE_ADDR can be used to get IR address.

9

REQUEST_METHOD

The method used to make the request. The most common methods are GET and POST.

10

SCRIPT_FILENAME

The full path to the CGI script.

11

SCRIPT_NAME

The name of the CGI script.

12

SERVER_NAME

The server’s hostname or IP Address.

13

SERVER_SOFTWARE

The name and version of the software the server is running.

Here is small CGI program to list out all the CGI variables.

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV = {
   "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
   "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
   "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
   "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
   "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
   "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
   "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
   "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
   "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI Environment Variables</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ ) {
      cout << "<tr><td>" << ENV << "</td><td>";
      
      // attempt to retrieve value of environment variable
      char *value = getenv( ENV.c_str() );  
      if ( value != 0 ) {
         cout << value;                                 
      } else {
         cout << "Environment variable does not exist.";
      }
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Что такое веб-сервисы

Чтобы объяснить, что мы имеем в виду под веб-сервисом, давайте возьмём все сайты, разобьём их на группы по назначению и увидим разницу между ними.

Знакомство с компанией:

  • визитки,
  • корпоративные сайты.

Такие сайты решают имиджевые задачи. Они рассказывают о компании или личности, показывают новости, знакомят с сотрудниками, товарами и услугами и т. д. Коммерческую пользу от сайта несёт прайс на услуги, калькулятор, онлайн-консультанти т. п.

Продажи:

Информационные:

  • блоги,
  • медиа.

Такие ресурсы освещают события и вопросы разной степени значимости и тематики. Ожидается, что у информационных сайтов будет рубрикатор, поиск, возможность оставить комментарий и поделиться статьёй в соцсетях, подписка на рассылку новостей, мобильная вёрстка и безупречная SEO-оптимизация, позволяющая сайту быть на первых местах в поисковой выдаче по актуальным запросам.

Блог не обязательно делать с нуля — платформ для этих целей, вроде LiveJournal, Blogger, Blogspot, Tumblr и других, хватало во все времена.

Общение:

  • соцсети,
  • форумы,
  • сайты знакомств.

Хотя в 2019 году такие сайты успешно выполняют роль и торговой площадки, и источника новостей, в первую очередь они были придуманы для того, чтобы помочь завязать отношения с новыми людьми и поддерживать их онлайн со старыми друзьями и родственниками. Среди основных функций — профиль пользователя, возможность обмениваться личными сообщениями, создавать топики и оставлять комментарии.

Веб-сервисы:

  • доски объявлений,
  • каталоги,
  • онлайн-консультации,
  • поиск товаров и сравнение цен,
  • решения для бизнеса,
  • торговые маркетплейсы,
  • системы бронирования.

С помощью веб-сервиса пользователь в режиме реального времени получает услугу или совершает действие: покупает билет, обрабатывает фотографию, собирает презентацию или пересчитывает одну валюту в другую по текущему курсу. С этой точки зрения веб-сервисы напоминают программы или мобильные приложения. Пока визитки или лендинги просто продают услуги и рассказывают о компании, веб-сервисы несут практическую пользу.

Сайты-сервисы и интернет-сервисы — это синонимы веб-сервисов, поэтому не теряйтесь, если встретите такие формулировки.

Сервисы должны быть полезными, их главная задача — сделать так, чтобы пользователь решил проблему быстро и с минимальными усилиями. Представьте, что вам нужна кредитная карта. Чтобы выбрать и заказать подходящую, вы можете самостоятельно изучить сайты десятка банков, потом поехать в офис одного из них, отстоять очередь, поговорить с менеджером, заполнить документы, а через неделю вернуться за готовой кредиткой. Другой вариант — воспользоваться сервисами вроде banki.ru или sravni.ru, где в одном месте собрана вся важная информация о продуктах и есть функция заказа онлайн.

Хороший сервис всегда выглядит лаконично. Чем меньше деталей отвлекает пользователя от основной функции, тем лучше. Наглядный пример — любые сервисы «Яндекса» или Google: на странице с картами вы найдёте только карты, а на сайте онлайн-кошелька — только инструмент для управления финансами, без лишних ссылок и рекламы других продуктов.

Преимущества и недостатки

Преимущества
  • Веб-службы обеспечивают взаимодействие программных систем независимо от платформы. Например, Windows-C#-клиент может обмениваться данными с Java-сервером, работающим под Linux.
  • Веб-службы основаны на базе открытых стандартов и протоколов. Благодаря использованию XML достигается простота разработки и отладки веб-служб.
  • Использование интернет-протокола обеспечивает HTTP-взаимодействие программных систем через межсетевой экран. Это значительное преимущество, по сравнению с такими технологиями, как CORBA, DCOM или Java RMI. С другой стороны, веб-службы не привязаны намертво к HTTP — могут использоваться и другие протоколы.
Недостатки
  • Меньшая производительность и больший размер сетевого трафика по сравнению с технологиями RMI, CORBA, DCOM за счёт использования текстовых XML-сообщений. Однако на некоторых веб-серверах возможна настройка сжатия сетевого трафика.
  • Аспекты безопасности. Ответственные веб-службы должны использовать кодирование, возможно — требовать аутентификации пользователя. Достаточно ли здесь применения HTTPS, или предпочтительны такие решения, как XML Signature, XML Encryption или SAML — должно быть решено разработчиком.

Simple URL Example: Get Method

Here is a simple URL which will pass two values to hello_get.py program using GET method.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Below is a program to generate cpp_get.cgi CGI program to handle input given by web browser. We are going to use C++ CGI library which makes it very easy to access passed information −

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "First name: " << **fi << endl;  
   } else {
      cout << "No text entered for first name" << endl;  
   }
   
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "Last name: " << **fi << endl;  
   } else {
      cout << "No text entered for last name" << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Now, compile the above program as follows −

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Generate cpp_get.cgi and put it in your CGI directory and try to access using following link −

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

This would generate following result −

First name: ZARA 
Last name: ALI 

С этим читают