3. CGI Standard Input: Hầu hết dữ liệu gởi tới một Web server được sử dụng để thiết lập biến môi trường , nhưng không phải tất cả đều thích hợp (một cách vừa vặn) trong một biến môi trường. Khi một user submit một dữ liệu để được xử lý bằng một CGI Script, dữ liệu đó được nhận như một URL_encoded search string ( chuỗi URL được mã hóa ) hoặc thông qua standard input stream (dòng dữ liệu nhập chuẩn ). Server phải được biết method được sử dụng để submit dữ liệu đó để biết cách xử lý dữ liệu. Việc gởi dữ liệu như standard input là cách trực tiếp hay nhất để gởi dữ liệu. Server chỉ cần báo cho gateway script có bao nhiêu tập 8-bit dữ liệu đọc từ standard input. Script mở dòng dữ liệu nhập chuẩn và đọc số lượng đã được chỉ rõ của dữ liệu . Trong khi URL_encoded search string quá dài có thể bị cắt bớt, dữ liệu gởi vào bằng dòng dữ liệu nhập chuẩn sẽ không bị cắt bớt. Do đó dòng dữ liệu nhập chuẩn là cách được ưu tiên hơn để gởi dữ liệu . 4. Form - HTML : Bạn có thể nhận những thông tin hay dữ liệu đăng ký khi bạn tạo những fill-out form. Dưới HTTP 1.0, có hai phương thức đăng ký (submission method) cho form : 1. Method GET của HTTP sử dụng URL_encoded search tring. Khi một server nhận một URL_encoded search string, server đánh dấu trị của search string tới biến QUERY_STRING. 2. Method POST của HTTP sử dụng standard input stream. Khi server nhận dữ liệu từ standard input stream, server đánh dấu trị được kết hợp với chiều dài của input stream tới biến CONTENT_LENGHT . Một ví dụ về Web document chứa 1 form với 3 trường khóa : NAME, ADDRESS, và PHONE_NUMBER. Giả sử URL tới script là : http://www.tvb.com/cgi-bin/survey.p1 và user trả lời như sau : Sandy Brown 12 Sunny Lane WhoVille , USA 987-654-3210 Thông tin đăng ký sử dụng method POST và GET được xem xét khác nhau bởi server. Khi method GET được sử dụng, server thiết lập những biến môi trường sau và sau đó gởi dữ liệu nhập vào script survey.p1 : PATH=/bin:/usr/bin:/usr/etc:/usr/ucb SERVER_SOFTWARE = CERN/3.0 SERVER_NAME = www.tvp.com GATEWAY_INTERFACE = CGI/1.1 SERVER_PROTOCOL = HTTP/1.0 SERVER_PORT = 80 REQUEST_METHOD = GET HTTP_ACCEPT = text/plain, text/html, application/rtf,application/postsript, audio/basic, audio/x-aiff, image/gif, image/jpeg, image/tiff, video/mpeg PATH_INFO = PATH_TRANSLATED = SCRIPT_NAME = /cgi-bin/survey.p1 QUERY_STRING = NAME=Sancy+Brown&ADDRESS=12+Sunny+Lane+WhoVille, +USA &PHONE_NUMBER=987-654-3210 REMOTE_HOST = REMOTE_ADDR = REMOTE_USER = AUTH_TYPE = CONTENT_TYPE = CONTENT_LENGTH = Khi method post được sử dụng, server thiết lập những biến môi trường sau đây sau đó gởi input tới script survey.p1 : PATH=/bin:/usr/bin:/usr/etc:/usr/ucb SERVER_SOFTWARE = CERN/3.0 SERVER_NAME = www.tvp.com GATEWAY_INTERFACE = CGI/1.1 SERVER_PROTOCOL = HTTP/1.0 SERVER_PORT = 80 REQUEST_METHOD = POST HTTP_ACCEPT = text/plain, text/html, application/rtf,application/postsript, audio/basic, audio/x-aiff, image/gif, image/jpeg, image/tiff, video/mpeg PATH_INFO = PATH_TRANSLATED = SCRIPT_NAME = /cgi-bin/survey.p1 QUERY_STRING = REMOTE_HOST = REMOTE_ADDR = REMOTE_USER = AUTH_TYPE = CONTENT_TYPE = application/x-www-form-urlencoded CONTENT_LENGTH = 81 -2- Dữ liệu POST-submitted sau đây được gởi tới gateway script thông qua standard input stream : NAME=Sandy+Brown&ADDRESS=12+Sunny+Lane+WhoVille, +USA&PHONE_NUMBER=987-654-3210 IV. Xuất dữ liệu từ CGI Script : Sau khi script hoàn tất việc xử lý input nó sẽ xuất output trở lại cho Server. Server sau đó sẽ gởi output cho client. Thông thường output này là ở trong 1 form của một HTTP response (thông tin gởi đáp lại) bao gồm1 header theo sau là một khoảng trắng và một BODY. Trong khi CGI header của output được format theo dạng chuẩn, BODY của output được format theo cách thức bạn chỉ định trong header. Ví dụ, BODY có thể chứa 1 HTML document để máy client hiển thị cho người đọc. Việc tạo dữ liệu xuất từ một CGI script thì tương đối đơn giản. Tất cả những việc bạn phải làm là định dạng dữ liệu xuất vào trong một header và body, xử dụng ngôn ngữ lập trình mà bạn thích. Ví dụ nếu bạn muốn cript xuất một tài liệu HTML xử dụng PERL thì như sau : #!/usr/bin/perl #tạo header với khoảng trắng được thêm vào phiá sau header print “Content-type: text/html\n\n”; #đưa body vào dạng HTML format print <<”MAIN”; <HTML> <HEAD><TITLE>Output from Script</TITLE></HEAD> <BODY> <H1>Top 10 reason for using CGI</H1> <P>10. Customer feeback.</P> <P>9. Obtaning questionnaire and survey responses.</P> <P>8. Tracking visitor count .</P> <P>7. Automating searches.</P> <P>6. Creating easy database interfaces.</P> <P>5. Building gateways to other protocols.</P> <P>4. HTML 2.0 image maps.</P> <P>3. User authentication.</P> <P>2. On-line order processing.</P> <P>1. Generating documents on the fly.</P> </BODY> -3- MAIN Server xử lý dữ liệu xuất, thiết lập biến môi trường, tạo một HTTP header, sau đó gởi dữ liệu tới client. Ví dụ đây là những dòng thông báo trong HTTP header mà ta có thể thấy trên một CERN Web server : HTTP/1.0 302 Found MINE-Version: 1.0 Server : CERN/3.0 Date :Monday, 4-Mar-96 23:59:59 HTS Content-type:text/html Content-length: 485 <HTML> <HEAD><TITLE>Output from Script</TITLE></HEAD> <BODY> <H1>Top 10 reason for using CGI</H1> <P>10. Customer feeback.</P> <P>9. Obtaning questionnaire and survey responses.</P> <P>8. Tracking visitor count .</P> <P>7. Automating searches.</P> <P>6. Creating easy database interfaces.</P> <P>5. Building gateways to other protocols.</P> <P>4. HTML 2.0 image maps.</P> <P>3. User authentication.</P> <P>2. On-line order processing.</P> <P>1. Generating documents on the fly.</P> </BODY> MAIN *CGI HEADERS CGI header chứa chỉ dẫn (directive) tới server. Hiện thời có ba chỉ dẫn server hợp lệ : Content-type Location Status Một header có thể chứa một hoặc tất cả các chỉ dẫn này. CGI script của bạn sẽ xuất những chỉ dẫn tới server. Header luôn được theo sau bằng một khoảng trắng để phân biệt header với BODY. -4- a.Sử dụng Content-Type trong CGI Headers : Trường content_type trong một CGI header chỉ rõ MIME type của dữ liệu được gởi trở lại cho client. Thường dữ liệu xuất từ một script là một document đã được format, ví dụ như một HTML document. Bạn có thể chỉ rõ kiểu dữ liệu trong header như sau : Content-type : text/html b.Sử dụng Locations trong CGI headers : Nếu dữ liệu xuất của Script không là một document được tạo trong script đó. Bạn có thể tham khảo bất kỳ document nào trên Web sử dụng trường Location. Trường Location được sử dụng để tham khảo 1 file bằng URL. Server xử lý vị trí tham khảo đến trực tiếp hoặc gián tiếp phụ thuộc vào vị trí của file. Nếu server tìm thấy file cục bộ, nó sẽ gởi file tới client. Nếu không thì server sẽ gián tiếp gởi tới client bằng cách gởi URL tới client và client sẽ nhận được file. Bạn có thể chỉ rõ một vị trí (location) trong Script như sau : Location:http://www.typress.com/ c.Sử dụng Status trong CGI Headers : Trường Status được sử dụng để gởi một Status Line tới server để chuyển tới Client . Mã Status được biểu diễn như một mã three-digit theo sau bởi một chuỗi mà thông thường nó được dùng để thông báo trạng thái sau khi gởi. Số đầu tiên của 1 mã Status cho thấy các trạng thái như sau : 1xx chưa cấp phát. 2xx thành công. 3xx gởi lại một lần nữa. 4xx Client bị lỗi. 5xx Server bị lỗi. Nhiều mã Status được sử dụng bởi server, mã Status mà CGI script gởi tới 1 client thông thường là mã client error. Ví du, Script không thể tìm thấy 1 file và thay thế bằng cách không trả lại gì cả, bạn chỉ rõ rằng Script xuất ra một mã lỗi. Đây là danh sách của các mã client error : Status : 401 không được phép, xác nhận không thành công. User không được phép truy xuất file phải truy xuất lại. -5- Status : 403 bị cấm. Yêu cầu không được chấp nhận, user không được phép truy xuất file. Status : 404 không tìm thấy. Tài nguyên được chỉ ra không thể tìm thấy. Status : 405 method không được cho phép. Method được sử dụng để submit không được cho phép. V TÓM TẮT : Common gateway interface đã tạo cho chúng ta khả năng tạo ra những trang Web có tính tương tác cao với người đọc Web và thêm vào đó là giúp cho người tạo Web những khả năng tự động hóa trang Web của mình như cho phép nhập dữ liệu từ clien vào server thông qua những fill-out form, database query, index search, và tự động tạo ra những tài liệu, dữ liệu xuất cho người đọc…. -6- . = 81 -2- Dữ liệu POST-submitted sau đây được gởi tới gateway script thông qua standard input stream : NAME=Sandy+Brown&ADDRESS= 12+ Sunny+Lane+WhoVille, +USA&PHONE_NUMBER=987-654- 321 0 IV = SCRIPT_NAME = /cgi-bin/survey.p1 QUERY_STRING = NAME=Sancy+Brown&ADDRESS= 12+ Sunny+Lane+WhoVille, +USA &PHONE_NUMBER=987-654- 321 0 REMOTE_HOST = REMOTE_ADDR = REMOTE_USER = AUTH_TYPE = CONTENT_TYPE. : http://www.tvb.com/cgi-bin/survey.p1 và user trả lời như sau : Sandy Brown 12 Sunny Lane WhoVille , USA 987-654- 321 0 Thông tin đăng ký sử dụng method POST và GET được xem xét khác nhau bởi