post是什么意思
当前位置:以往代写 > JAVA 教程 >post是什么意思
2019-06-14

post是什么意思

post是什么意思

在很多应用措施中利用GET都没有问题。可是,GET要求通过一个情况变量将本身的数据通报给CGI措施。但如果GET字串过长,有些Web处事器大概用光本身的情况空间(若字串长度高出200字符,就应开始体贴这方面的问题)。CGI为此提供了一个办理方案:POST。通过POST,数据可以编码,并按与GET沟通的要领连结起来。但POST操作尺度输入将编码事后的查询字勾串报给CGI措施。我们要做的全部工作就是判定查询字串的长度,而这个长度已在情况变量CONTENT_LENGTH中生存好了。一旦知道了长度,就可自由分派存储空间,并从尺度输入中读入指定命量的字符。
对一个用来节制POST的CGI措施,由CGITools.h提供的Pair和CGI_vector均可不加丝毫改变地利用。下面这段措施展现了写这样的一个CGI措施有何等简朴。这个例子将回收“纯”C++,所以studio.h库被iostream(IO数据流)取代。对付iostream,我们可以利用两个预先界说好的工具:cin,用于同尺度输入毗连;以及cout,用于同尺度输出毗连。有几个步伐可从cin中读入数据以及向cout中写入。但下面这个措施筹备回收尺度要领:用“<<”将信息发给cout,并用一个成员函数(此时是read())从cin中读入数据:

 

//: POSTtest.cpp
// CGI_vector works as easily with POST as it
// does with GET. Written in "pure" C++.
#include <iostream.h>
#include "CGITools.h"

void main() {
  cout << "Content-type: text/plain\n" << endl;
  // For a CGI "POST," the server puts the length
  // of the content string in the environment 
  // variable CONTENT_LENGTH:
  char* clen = getenv("CONTENT_LENGTH");
  if(clen == 0) {
    cout << "Zero CONTENT_LENGTH" << endl;
    return;
  }
  int len = atoi(clen);
  char* query_str = new char[len + 1];
  cin.read(query_str, len);
  query_str[len] = '\0';
  CGI_vector query(query_str);
  // Test: dump all names and values
  for(int i = 0; i < query.size(); i++)
    cout << "query[" << i << "].name() = [" <<
      query[i].name() << "], " <<
      "query[" << i << "].value() = [" <<
      query[i].value() << "]" << endl;
  delete query_str; // Release storage
} ///:~

getenv()函数返回指向一个字串的指针,谁人字串指示着内容的长度。若指针为零,表白CONTENT_LENGTH情况变量尚未配置,所以必定某个处所出了问题。不然就必需用ANSI C库函数atoi()将字串转换成一个整数。这个长度将与new一起运用,分派足够的存储空间,以便容纳查询字串(另加它的空中止符)。随后为cin()挪用read()。read()函数需要取得指向方针缓冲区的一个指针以及要读入的字节数。随后用空字符(null)中止query_str,指出已经抵达字串的末端,这就叫作“空中止”。
到这个时候,我们获得的查询字串与GET查询字串已经没有什么区别,所以把它通报给用于CGI_vector的构建器。随后便和前例一样,我们可以自由vector内差异的字段。
为测试这个措施,必需把它编译到主机Web处事器的cgi-bin目次下。然后就可以写一个简朴的HTML页举办测试,就象下面这样:

 

<HTML>
<HEAD>
<META CONTENT="text/html">
<TITLE>A test of standard HTML POST</TITLE>
</HEAD>
Test, uses standard html POST
<Form method="POST" ACTION="/cgi-bin/POSTtest">
<P>Field1: <INPUT TYPE = "text" NAME = "Field1" 
VALUE = "" size = "40"></p>
<P>Field2: <INPUT TYPE = "text" NAME = "Field2" 
VALUE = "" size = "40"></p>
<P>Field3: <INPUT TYPE = "text" NAME = "Field3" 
VALUE = "" size = "40"></p>
<P>Field4: <INPUT TYPE = "text" NAME = "Field4" 
VALUE = "" size = "40"></p>
<P>Field5: <INPUT TYPE = "text" NAME = "Field5" 
VALUE = "" size = "40"></p>
<P>Field6: <INPUT TYPE = "text" NAME = "Field6" 
VALUE = "" size = "40"></p>
<p><input type = "submit" name = "submit" > </p>
</Form>
</HTML>

填好这个表单并提交出去今后,会获得一个简朴的文本页,个中包括了理会出来的功效。从中可知道CGI措施是否在正常事情。
虽然,用一个措施片来提交数据显得更有趣一些。然而,POST数据的提交属于一个差异的进程。在用通例方法挪用了CGI措施今后,必需另行成立与处事器的一个毗连,以便将查询字串反馈给它。处事器随后会举办一番处理惩罚,再通过尺度输入将查询字串反馈回CGI措施。
为成立与处事器的一个直接毗连,必需取得本身建设的URL,然后挪用openConnection()建设一个URLConnection。可是,由于URLConnection一般不答允我们把数据发给它,所以必需很好笑地挪用setDoOutput(true)函数,同时挪用的还包罗setDoInput(true)以及setAllowUserInteraction(false)——注释⑥。最后,可挪用getOutputStream()来建设一个OutputStream(输出数据流),并把它封装到一个DataOutputStream里,以便能按传统方法同它通信。下面列出的即是一个用于完成上述事情的措施片,必需在从它的各个字段里收集了数据之后再执行它:

 

//: POSTtest.java
// An applet that sends its data via a CGI POST
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.io.*;

public class POSTtest extends Applet {
  final static int SIZE = 10;
  Button submit = new Button("Submit");
  TextField[] t = new TextField[SIZE];
  String query = "";
  Label l = new Label();
  TextArea ta = new TextArea(15, 60);
  public void init() {
    Panel p = new Panel();
    p.setLayout(new GridLayout(t.length + 2, 2));
    for(int i = 0; i < t.length; i++) {
      p.add(new Label(
        "Field " + i + "  ", Label.RIGHT));
      p.add(t[i] = new TextField(30));
    }
    p.add(l);
    p.add(submit);
    add("North", p);
    add("South", ta);
  }
  public boolean action (Event evt, Object arg) {
    if(evt.target.equals(submit)) {
      query = "";
      ta.setText("");
      // Encode the query from the field data:
      for(int i = 0; i < t.length; i++)
         query += "Field" + i + "=" +
           URLEncoder.encode(
             t[i].getText().trim()) +
           "&";
      query += "submit=Submit";
      // Send the name using CGI's POST process:
      try {
        URL u = new URL(
          getDocumentBase(), "cgi-bin/POSTtest");
        URLConnection urlc = u.openConnection();
        urlc.setDoOutput(true);
        urlc.setDoInput(true);
        urlc.setAllowUserInteraction(false);
        DataOutputStream server = 
          new DataOutputStream(
            urlc.getOutputStream());
        // Send the data
        server.writeBytes(query);
        server.close();
        // Read and display the response. You
        // cannot use 
        // getAppletContext().showDocument(u);
        // to display the results as a Web page!
        DataInputStream in = 
          new DataInputStream(
            urlc.getInputStream());
        String s;
        while((s = in.readLine()) != null) {
          ta.appendText(s + "\n");
        }
        in.close();
      }
      catch (Exception e) {
        l.setText(e.toString());
      }
    }
    else return super.action(evt, arg);
    return true;
  }
} ///:~

#p#分页标题#e#

⑥:我不得不说本身并没有真正领略这儿都产生了什么工作,这些观念都是从Elliotte Rusty Harold编著的《Java Network Programming》里得来的,该书由O’Reilly于1997年出书。他在书中提到了Java连网函数库中呈现的很多令人疑惑的Bug。所以一旦涉足这些规模,工作就不是编写代码,然后让它本身运行那么简朴。必然要鉴戒潜在的陷阱!

信息发送随处事器后,我们挪用getInputStream(),并把返回值封装到一个DataInputStream里,以便本身能读取功效。要留意的一件工作是功效以文本行的形式显示在一个TextArea(文本区域)中。为什么不简朴地利用getAppletContext().showDocument(u)呢?事实上,这正是那些陷阱中的一个。上述代码可以很好地事情,但如果试图换用showDocument(),险些一切城市遏制运行。也就是说,showDocument()确实可以运行,但从POSTtest获得的返回功效是“Zero CONTENT_LENGTH”(内容长度为零)。所以不知道为什么原因,showDocument()阻止了POST查询向CGI措施的通报。我很难判定这到底是一个在今后版本里会修复的Bug,照旧由于我的领略不足(我看过的书对此讲得都很恍惚)。但无论在哪种环境下,只要能僵持在文本区域里寓目自CGI措施返回的内容,上述措施片运行时就没有问题。

    关键字:

在线提交作业