post请求_post请求参数 - CSDN
精华内容
参与话题
  • 简述HTML中post与get请求的区别

    千次阅读 2019-06-20 08:31:16
    简述ajax中post与get请求的区别,以及请求报文欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...

    post与get的对比

    1.参数

    GET传递的参数只能带URL后面,文本格式QueryString,各浏览器一般有长度限制,一般认为是2083,如果有中文字符更短。提交到服务器端的数据量小。

    POST可以传递application/x-www-form-urlencoded的类似QueryString、multipart/form-data的二进制报文格式(支持文件信息嵌入报文传输)、纯文本或二进制的body参数。提交到服务器端的数据量大。

    2.用途

    GET用于从服务器端获取数据,包括静态资源(HTML|JS|CSS|Image等等)、动态数据展示(列表数据、详情数据等等)。

    POST用于向服务器提交数据,比如增删改数据,提交一个表单新建一个用户、或修改一个用户等。

    3.缓存

    GET时默认可以复用前面的请求数据作为缓存结果返回,此时以完整的URL作为缓存数据的KEY。所以有时候为了强制每次请求都是新数据,我们可以在URL后面加上一个随机参数Math.random或时间戳new Date().getTime()、或版本号。

    比如abc.com?a=1&rnd=0.123987之类的。这也是目前一些静态资源后面加一个很长的版本号的原因,jquery-min.js?v=13877770表示一个版本,当页面引用jquery-min.js?v=13877771时浏览器必然会重新去服务器请求这个资源。jQuery.ajax方法,如果cache=false,则会在GET请求参数中附加”_={timestamp}”来禁用缓存。

    POST一般则不会被这些缓存因素影响。

    4.安全性

    默认对于nginx的access log,会自动记录get或post的完整URL,包括其中带的参数。

    对于POST来说,请求的报文却不会被记录,这些对于敏感数据来说,POST更安全一些。

    5.自动化性能测试:

    基于上面提到的nginx日志,可以使用grep GET+日期,awk格式化,然后sort -u去重,从而提取到某天的所有GET请求URL,使用程序模拟登陆,然后请求所有URL即可获取简单的性能测试数据,每个请求是否正确,响应时间多少等等。

    但是对于POST请求,因为不知道报文,无法这样简单处理。可以通过nginx-lua获取报文输出到log,这样格式化会麻烦很多,但不失为一个办法。

    6.GET和POST对服务器的状态

    根据http的设计,大家在看到get的时候,都期望这个请求对服务器没有修改,看到post的时候,都认为这对服务器产生了修改。

    7.GET幂等,POST不幂等

    1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。

    2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。

    3.比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。

    请求报文

    1. 请求报文构成

    一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
    大致结构是这样的:

         <request-line> //请求行
        
         <headers> //首部行
            
         <blank line> //空行
       
         <request-body> //请求体
    

    一个简单的例子:

        POST /user HTTP/1.1      //请求行
        Host: www.user.com
        Content-Type: application/x-www-form-urlencoded
        Connection: Keep-Alive
        User-agent: Mozilla/5.0.      //以上是首部行
        (此处必须有一空行)  //空行分割header和请求内容 
        name=world   请求体
    

    1.1 请求行

    请求行由三部分组成:请求方法,请求URL(不包括域名),HTTP协议版本
    请求方法比较多:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT
    最常用的是GET和POST。

    1.1.1 请求方法

    1) GET
    传递参数长度受限制,因为传递的参数是直接表示在地址栏中,而特定浏览器和服务器对url的长度是有限制的。
    因此,GET不适合用来传递私密数据,也不适合拿来传递大量数据。

    一般的HTTP请求大多都是GET。
    2)POST

    POST把传递的数据封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,对数据量没有限制,也不会显示在URL中。
    表单的提交用的是POST。
    3)HEAD

    HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
    4)DELETE

    删除某一个资源。

    5)OPTIONS

    用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

    6)PUT

    把一个资源存放在指定的位置上。
    本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

    关于POST和PUT的区别以及请求方法的幂等性,请参考文章:http的7种请求方法和幂等性

    7)TRACE

    回显服务器收到的请求,主要用于测试或诊断。

    8)CONNECT

    CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。

    1.1.2 HTTP协议版本

    1)HTTP/1.0
    HTTP/1.0支持:GET、POST、HEAD三种HTTP请求方法。
    2)HTTP/1.1
    HTTP/1.1是当前正在使用的版本。该版本默认采用持久连接,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
    HTTP/1.1新增了:OPTIONS、PUT、DELETE、TRACE、CONNECT五种HTTP请求方法。

    1.2 请求头部

    请求头部由关键字/值对组成,每行一对

    User-Agent : 产生请求的浏览器类型
    Accept : 客户端希望接受的数据类型,比如 Accept:text/xml(application/json)表示希望接受到的是xml(json)类型
    Content-Type:发送端发送的实体数据的数据类型。
    比如,Content-Type:text/html(application/json)表示发送的是html类型。
    Host : 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机

    1.2.1 Content-Type

    常见的Content-Type:

    Content-Type 解释
    text/html html格式
    text/plain 纯文本格式
    text/css CSS格式
    text/javascript js格式
    image/gif gif图片格式
    image/jpeg jpg图片格式
    image/png png图片格式
    application/x-www-form-urlencoded POST专用:普通的表单提交默认是通过这种方式。form表单数据被编码为key/value格式发送到服务器。
    application/json POST专用:用来告诉服务端消息主体是序列化后的 JSON 字符串
    text/xml POST专用:发送xml数据
    multipart/form-data POST专用:下面讲解

    multipart/form-data
    用以支持向服务器发送二进制数据,以便可以在 POST 请求中实现文件上传等功能
    现在用Postman向百度发送一个请求方式为multipart/form-data的POST包,请求报文是这样的:

        POST / HTTP/1.1
        Host: www.baidu.com
        Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
        Cache-Control: no-cache
        Postman-Token: 033120fe-2185-15d4-e486-75e86e2baddd
        
        ------WebKitFormBoundary7MA4YWxkTrZu0gW
        Content-Disposition: form-data; name="url"
        
        https://www.baidu.com/
        ------WebKitFormBoundary7MA4YWxkTrZu0gW
        Content-Disposition: form-data; name="name"
        
        waffle
        ------WebKitFormBoundary7MA4YWxkTrZu0gW
        Content-Disposition: form-data; name="desk"; filename="桌子.jpg"
        Content-Type: image/jpeg
        
        ...contents of 桌子.jpg...
        ------WebKitFormBoundary7MA4YWxkTrZu0gW--
    

    其中, boundary这个参数是分界线的意思,这个分界线参数具体是什么你可以随意自定义 ,建议定义复杂一点,因为这样子才不会跟请求体中其它字段重复。
    上面的例子看出分界线=“–”+boundary
    每个参数都由分界线分隔开,参数名(二进制数据还需要指明文件类型)和参数值之间有一行空行,这个空行不能省略:

        ------WebKitFormBoundary7MA4YWxkTrZu0gW
        Content-Disposition: form-data; name="url"
        
        https://www.baidu.com/
    

    消息主体最后以 --boundary-- 标示结束。
    更加详细的解释可以参考:Multipart/form-data

    1.3 空行

    请求头之后是一个空行,通知服务器以下不再有请求头

    1.4 请求体

    GET没有请求数据,POST有。
    与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length 。

    展开全文
  • 四种常见的post请求中的参数形式

    万次阅读 2019-01-11 13:14:07
    四种常见的post请求中的参数形式 post请求中的参数形式 一、初识post请求实例 1、Angular的ajax功能 AngularJs的ajax的post请求参数就是提交的json字符串。如: var data = {'name':'jack'}; $http.post(url,data)....

    四种常见的post请求中的参数形式

    post请求中的参数形式
    一、初识post请求实例
    1、Angular的ajax功能

    AngularJs的ajax的post请求参数就是提交的json字符串。如:

    var data = {'name':'jack'};
    $http.post(url,data).success(function(rsp){
        //    code
     })
    

    2、application/json

    JSON.stringify()的方法,服务端也有处理JSON的函数。

    //请求的参数要处理:

    JSON.stringify({name:'jack'})
    

    在这里插入图片描述

    图片描述
    二、四种常见的post请求方式:
    1、背景

    注:enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为 “application/x-www-form-urlencoded”
    在这里插入图片描述

    图片描述

    (1)、HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。
    (2)、协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
    (3)、数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
    2、开始介绍四种方式:

    (1)、application/x-www-form-urlencoded
    这应该是最常见的 POST 提交数据的方式了。浏览器的原生 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

    <form action="form_action.asp" enctype="text/plain">
      <p>First name: <input type="text" name="fname" /></p>
      <p>Last name: <input type="text" name="lname" /></p>
      <input type="submit" value="Submit" />
    </form>
    

    此时可以看到,

    Content-Type: application/x-www-form-urlencoded;charset=utf-8
    title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

    首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式很好的支持,常用的如jQuery中的ajax请求,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8

    (2)、multipart/form-data
    这也是常见的post请求方式,一般用来上传文件,各大服务器的支持也比较好。所以我们使用表单 上传文件 时,必须让表单的enctype属性值为 multipart/form-data.

    注意:以上两种方式:application/x-www-form-urlencoded和multipart/form-data都是浏览器原生支持的。
    

    (3)、application/json
    application/json作为响应头并不陌生,实际上,现在很多时候也把它作为请求头,用来告诉服务端消息主体是序列化的JSON字符串,除了低版本的IE,基本都支持。除了低版本的IE都支持JSON.stringify()的方法,服务端也有处理JSON的函数,使用json不会有任何麻烦。例如:

    //请求数据
    var data = {name:'jack',sex:'man'};
    //请求数据序列化处理
    JSON.stingify(data);
    

    //结果:{‘name’:‘jack’,‘sex’:‘man’};

    (4)、text/xml
    三、postman中post请求的form-data、x-www-form-urlencoded、raw、binary的区别

    1、form-data:
    等价于http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;
    由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

    在这里插入图片描述
    图片描述

    2、x-www-form-urlencoded:
    等价于application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,name=java&age = 23
    在这里插入图片描述
    图片描述

    3、raw
    可以上传任意格式的文本,可以上传text、json、xml、html等
    在这里插入图片描述
    图片描述

    4、binary
    相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

    multipart/form-data与x-www-form-urlencoded区别
    multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;
    x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。

    展开全文
  • Post请求基本步骤

    千次阅读 2018-09-09 10:24:46
    接着我的博客前后端交互来,使用Post请求完成操作。 get方法从服务器获取数据。post方法向服务器提交数据。 public class MainActivity extends AppCompatActivity { OkHttpClient okHttpClient=new ...

    接着我的博客前后端交互来,使用Post请求完成操作。

    get方法从服务器获取数据。post方法向服务器提交数据。

    public class MainActivity extends AppCompatActivity {
        OkHttpClient okHttpClient=new OkHttpClient();
        private TextView textView;
        public String string=null;
        private String mBaseUrl="http://192.168.43.248:8080/OkHttp_Get/";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        public void doPost(View view){
                //post参数并不是拼接到url后面,而是作为请求体发送到服务端的。post方法需要传入一个RequestBody
                //get一般是从服务器获取一些数据,即使是传递参数也比较简单。直接拼接到url后面就可以了
                // post一般往服务器提交一些数据,提交表单注册信息,他所提交的一些数据比如说参数一般是作为请求体post到服务器端的。需要requestbody构造request。
                //如何构造request呢?它也有builder.
            textView=(TextView)findViewById(R.id.textView);
            //1.拿到okHttpClient对象
            FormEncodingBuilder requestBodyBuilder=new FormEncodingBuilder();
            //2.构造Request
            //2.1构造requestBody
            RequestBody requestBody=requestBodyBuilder.add("username","hyman").add("password","123").build();//它只有三个方法,仅仅是为了传递键值对的。
            Request.Builder builder=new Request.Builder();
            Request request= builder.url(mBaseUrl+"login").post(requestBody).build();
            //3  4
            executeRequest(request);
        }
        public void doGet(View view){
            textView=(TextView)findViewById(R.id.textView);
            //OkHttpClient okHttpClient=new OkHttpClient();
            Request.Builder builder=new Request.Builder();
            Request request=builder.get().url(mBaseUrl+"login?username=hyman&password=123").build();
            executeRequest(request);
        }
    
        private void executeRequest(Request request) {
            Call call = okHttpClient.newCall(request);
    
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {
                    L.e("onFailure"+e.getMessage());
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(Response response) throws IOException {
                    L.e("onResponse:");
                    //该方法的返回值是response,所以我们可以通过response拿到相关信息。
                    string = response.body().string();//想拿到字符串,可以从response-body-string
                    L.e(string);
                    /*InputStream is=response.body().byteStream();//即使是一个文件我们这里也可以IO操作。容量也就是我们一个buffer大小。这样就支持大文件下载。*/
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText(string);
                        }
                    });
                }
            });
        }
    }
    

    点击Post按钮,在textview上出现Login success

    MyEclipse控制台出现:hyman , 123

    使用post请求往服务器传输数据得到hyman 123,然后在前端也就是我们的模拟器上显示内容。

    get和简单的post的用法就结束了。

     

    postString方法:

    我们在实际开发过程中有一个post Json字符串到服务器。字符串中可能包含了很多信息(业务代码)。

     

    //将String作为requestBody post出去。和doPost唯一不同的是,requestBody的构造。
    // doPost是通过 FormEncodingBuilder去构造的,它主要是传递一个post参数的builder,
    // 我们要通过一个Builder构造一个requestBody,这个requestBody仅仅是一个字符串。我们不需要构造模式了
    public void doPostString(View view){
        textView=(TextView)findViewById(R.id.textView);
        //传递一个String
        RequestBody requestBody= RequestBody.create(MediaType.parse("text/plain;charset=utf-8"),"{username:hyman,password:123}");
        Request.Builder builder=new Request.Builder();
        Request request= builder.url(mBaseUrl+"postString").post(requestBody).build();
        //3  4
        executeRequest(request);
    }
    

    RequestBody的create方法:

    在MyEclipse userAction添加:

      //获取传递过来的String对象。postString()方法还需要配置。
        public String postString() throws IOException{
            HttpServletRequest request=ServletActionContext.getRequest();
            ServletInputStream is=request.getInputStream();
            //流变成字符串
            StringBuilder sb=new  StringBuilder();
            int len=0;
            byte[] buf=new byte[1024];
            while((len=is.read(buf))!=-1){
                sb.append(new String(buf,0,len));
            }
            System.out.println(sb.toString());
            return null;

        }

    struts.xml中添加:

     <action name="postString" class="com.imooc.action.UserAction" method="postString">
     </action>

    我们的预期结果是服务器端接收到{username:hyman,password:123}字符串。

    运行AS:点击POST STRING按钮。服务器MyEclipse控制台出现 {username:hyman,password:123

     

    我们介绍完了post与传递key value,postString接下来介绍用post传递File到服务端。

     

    public void doPostFile(View view){
        textView=(TextView)findViewById(R.id.textView);
        File file=new File(Environment.getExternalStorageDirectory(),"banner2.jpg");
        if(!file.exists()){
            L.e(file.getAbsolutePath()+"not exist!");
            return;
        }
        //mime type
        RequestBody requestBody= RequestBody.create(MediaType.parse("application/octet-stream"),file);
        Request.Builder builder=new Request.Builder();
        Request request= builder.url(mBaseUrl+"postFile").post(requestBody).build();
        //3  4
        executeRequest(request);
    }

     public String postFile() throws IOException{
            HttpServletRequest request=ServletActionContext.getRequest();
            ServletInputStream is=request.getInputStream();
            //files在Tomcat/webapps/OkHttp_Get,在这里新建文件夹files.
            String dir=ServletActionContext.getServletContext().getRealPath("files");
            File file=new File(dir,"banner2.jpg");
            FileOutputStream fos=new FileOutputStream(file);
            int len=0;
            byte[] buf=new byte[1024];
            while((len=is.read(buf))!=-1){
                fos.write(buf,0,len);
                
            }
            fos.flush();
            fos.close();
            
            return null;

        }

    struts.xml:

     <action name="postFile" class="com.imooc.action.UserAction" method="postFile">

     </action>

    把图片上传到服务器有权限问题,

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    post上传文件:到此我们已经完成了get post提交参数,post提交String,post提交file。还有post上传文件。了解过web的朋友肯定知道post是upload的一个文件,比如说一个表单,注册信息,填写相关的用户密码上传头像甚至是附件等等。post还可以提交文件。web开发的朋友知道它有一个属性,MultipartFormData必须设置到表单上面。OkHttp是如何上传图片的?

     

    //传递头像。
    public void doUpload(View view){
        textView=(TextView)findViewById(R.id.textView);
        File file=new File(Environment.getExternalStorageDirectory(),"banner2.jpg");
        if(!file.exists()){
            L.e(file.getAbsolutePath()+"not exist!");
            return;
        }
        //因为我们设计到文件还有参数可以考虑到又是一个构造者模式。其所涉及到的类叫MultipartBuilder.
        //"mPhoto"表单域,一般情况它是个input标签,他的type是file,所有的表单域都有个共性他有个name是key,通过key找到所对应的value、比如说表单域,文件的表单域肯定是个文件就代表了那个key。
        MultipartBuilder multipartBuilder=new MultipartBuilder();
        RequestBody requestBody= multipartBuilder.type(MultipartBuilder.FORM)
                .addFormDataPart("username","hyman")
                .addFormDataPart("password","123")
                .addFormDataPart("mPhoto","hyman.jpg",RequestBody.create(MediaType.parse("application/octet-stream"),file))
                .build();
        //mime type
        Request.Builder builder=new Request.Builder();
        Request request= builder.url(mBaseUrl+"uploadInfo").post(requestBody).build();
        //3  4
        executeRequest(request);
    }
    <Button
        android:id="@+id/button_doUpload"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doUpload"
        android:text="Upload" />
    

    public class UserAction extends ActionSupport{
        private String username;
        private String password;
       public File mPhoto;//必须和AS的那个key是一模一样的.可以指定fileName和contentType
        public String mPhotoFileName;
        public String mPhotoContentType;//没有它会有警告。
        
        public String uploadInfo() throws IOException{
            System.out.println(username+","+password);
            if (mPhoto==null) {
                System.out.print(mPhotoFileName+"is null");
            }
            String dir=ServletActionContext.getServletContext().getRealPath("files");
            File file=new File(dir,mPhotoFileName);
            FileUtils.copyFile(mPhoto,file);
            return  null;

        }

    }

     <action name="uploadInfo" class="com.imooc.action.UserAction" method="uploadInfo">
      </action>

    结果是:点击Upload按钮,服务器端出现一张图片,图片命名为hyman.jpg ,同时我们拿到username,password。

     

    post下载文件:

     

    展开全文
  • HTTP_POST请求的数据格式

    万次阅读 2018-05-23 20:41:31
    HTTP_POST请求的数据格式 在HTTP的请求头中,可以使用Content-type来指定不同格式的请求信息。 Content-type的类型 常见的媒体格式类型: &nbsp;&nbsp;&nbsp; text/html : HTML格式 &nbsp;&...

    HTTP_POST请求的数据格式

    在HTTP的请求头中,可以使用Content-type来指定不同格式的请求信息。

    Content-type的类型

    常见的媒体格式类型:

    •     text/html : HTML格式
    •     text/plain :纯文本格式      
    •     text/xml :  XML格式
    •     image/gif :gif图片格式    
    •     image/jpeg :jpg图片格式 
    •     image/png:png图片格式

    以applicaton开头的没提类型:

    • application/json    : JSON数据格式
    • application/xhtml+xml :XHTML格式
    • application/xml     : XML数据格式
    • application/atom+xml  :Atom XML聚合格式    
    • application/pdf       :pdf格式  
    • application/javascript :js格式
    • application/msword  : Word文档格式
    • application/octet-stream : 二进制流数据(如常见的文件下载)
    • application/x-www-form-urlencoded :form表单默认的数据格式类型,form表单数据被编码为key/value格式发送到服务器。

    另外一种常见的媒体格式是上传文件之时使用的:

    • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。

    除了原生的content-type,开发人员也可以完全自定义数据提交格式!

    最常用的三种:

    1. application/x-www-form-urlencoded,form表单默认的数据格式,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。比如下面的http请求格式:

      
      # Request Headers
      
      POST /adduser HTTP/1.1
      Host: localhost:8030
      Connection: keep-alive
      Content-Length: 16
      Pragma: no-cache
      Cache-Control: no-cache
      Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
      User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
      Content-Type: application/x-www-form-urlencoded
      Accept: */*
      Accept-Encoding: gzip, deflate, br
      Accept-Language: zh-CN,zh;q=0.9
      
      
      # Form Data
      
      name=name&age=11
    2. application/json,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。服务端语言也有很多函数去解析JSON,使用JSON可以支持更加复杂的结构化数据。比如下面的http请求格式:

      
      # Request Headers
      
      POST /adduser HTTP/1.1
      Host: localhost:8030
      Connection: keep-alive
      Content-Length: 24
      Pragma: no-cache
      Cache-Control: no-cache
      Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
      User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
      Content-Type: application/json
      Accept: */*
      Accept-Encoding: gzip, deflate, br
      Accept-Language: zh-CN,zh;q=0.9
      
      
      # Request Payload
      
      {"name":"121","age":121}
    3. multipart/form-data,对用于在表单中上传文件时,也可以上传普通数据,只需要让from的ectyle等于multipart/form-data就可以了。比如下面的http请求格式:

      
      # Request Header
      
      POST /adduser HTTP/1.1
      Host: localhost:8030
      Connection: keep-alive
      Content-Length: 232
      Pragma: no-cache
      Cache-Control: no-cache
      Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
      User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
      Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBRi81vNtMyBL97Rb
      Accept: */*
      Accept-Encoding: gzip, deflate, br
      Accept-Language: zh-CN,zh;q=0.9
      
      
      # Request Payload
      
      ------WebKitFormBoundaryBRi81vNtMyBL97Rb
      Content-Disposition: form-data; name="name"
      
      name1
      ------WebKitFormBoundaryBRi81vNtMyBL97Rb
      Content-Disposition: form-data; name="age"
      
      12
      ------WebKitFormBoundaryBRi81vNtMyBL97Rb--

      这种格式的数据会有一个边界线boundary(这里就是------WebKitFormBoundaryBRi81vNtMyBL97Rb)用于分割不同的字段,为了避免与正文内容重复,boundary很长很复杂。消息主体以boundary开始,紧接着就是内容描述信息,然后是回车,最后是字段具体的内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体以boundary结束。

    Request Headers部分各个字段的功能

    通过上面的例子,我们可以看到在Request Headers里面以后很多字段,比如Content-type,Host这些,那么这些字段又有什么意思呢,下面通过表格来介绍一下:

    Header 解释 示例
    Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html,*/*
    Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5
    Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip
    Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
    Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
    Authorization HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
    Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Connection: keep-alive
    Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;
    Content-Length 请求的内容长度 Content-Length: 348
    Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
    Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
    Expect 请求的特定的服务器行为 Expect: 100-continue
    From 发出请求的用户的Email From: user@email.com
    Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
    If-Match 只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
    If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
    If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
    If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
    Pragma 用来包含实现特定的指令 Pragma: no-cache
    Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Range 只请求实体的一部分,指定范围 Range: bytes=500-999
    Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer: http://www.zcmhi.com/archives/71.html
    TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
    Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
    User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
    Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
    Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning

    拓展知识:

    User-Agent里面包含了浏览器客户端的信息,比如:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36

    通过这个信息可以看到使用的是Chrome浏览器,内核是Apple的WebKit。

    其实前世界上主要有来自四个不同机构的四种的Web浏览器内核。每一家机构都推出了至少一种使用自己的内核的浏览器产品。

    这四家机构分别是Microsoft、Mozilla、Apple和Opera SAS,提供的内核则分别叫做Trident、Gecko、WebKit和Presto,推出的主打浏览器则分别叫做Internet Explorer、Firefox、Safari和Opera。我们最常使用的Chrome浏览器就是用的苹果公司的Webkit。国内的一些浏览器也是基于webkit内核的,其所谓的双核中的极速模式就是webkit内核,兼容模式就是ie的trident内核。

    Response Headers部分各个字段的功能

    Request Headers是请求头,Response Headers是响应头,同样,它也包含了一些字段信息:

    Header 解释 示例
    Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes
    Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age: 12
    Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow: GET, HEAD
    Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Cache-Control: no-cache
    Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Encoding: gzip
    Content-Language 响应体的语言 Content-Language: en,zh
    Content-Length 响应体的长度 Content-Length: 348
    Content-Location 请求资源可替代的备用的另一地址 Content-Location: /index.htm
    Content-MD5 返回资源的MD5校验值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
    Content-Range 在整个返回体中本部分的字节位置 Content-Range: bytes 21010-47021/47022
    Content-Type 返回内容的MIME类型 Content-Type: text/html; charset=utf-8
    Date 原始服务器消息发出的时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
    ETag 请求变量的实体标签的当前值 ETag: “737060cd8c284d8af7ad3082f209582d”
    Expires 响应过期的日期和时间 Expires: Thu, 01 Dec 2010 16:00:00 GMT
    Last-Modified 请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
    Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location: http://www.zcmhi.com/archives/94.html
    Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方 Pragma: no-cache
    Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数 Proxy-Authenticate: Basic
    refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) Refresh: 5; url=http://www.zcmhi.com/archives/94.html
    Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 Retry-After: 120
    Server web服务器软件名称 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
    Set-Cookie 设置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
    Trailer 指出头域在分块传输编码的尾部存在 Trailer: Max-Forwards
    Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked
    Vary 告诉下游代理是使用缓存响应还是从原始服务器请求 Vary: *
    Via 告知代理客户端响应是通过哪里发送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
    Warning 警告实体可能存在的问题 Warning: 199 Miscellaneous warning
    WWW-Authenticate 表明客户端请求实体应该使用的授权方案 WWW-Authenticate: Basic

    参考:

    https://imququ.com/post/four-ways-to-post-data-in-http.html

    https://blog.csdn.net/blueheart20/article/details/45174399

    展开全文
  • Post请求的四种方式

    千次阅读 2019-08-29 00:13:25
    Post请求四种传送方式的Python实现 HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。常见的四种编码方式如下: ♦1、application/x-...
  • HTTP请求详解含POST,GET实例

    万次阅读 多人点赞 2018-05-05 21:45:55
    HTTP的组成http消息由客户端到服务端的请求以及服务端到客户端的响应组成HTTP请求报文的格式请求头与请求正文中间有一行空行,是告诉服务器请求头到此结束了接下来是请求正文请求方法:get,post,head,delete等等,...
  • 在Http请求里post是其中比较常用的提交数据的请求方式,...Post请求包含两部分:请求头(header)和请求体(body)。 Post常见的请求体(body)有三种传输内容类型Content-type:application/x-www-form-urlenco...
  • Postman发送post请求

    万次阅读 2018-06-01 12:38:03
    Postman发送post请求在服务器开发过程中,要经常对get,post接口进行测试,get请求,浏览器就可以完成,而post请求浏览器用起来有点麻烦,有的浏览器支持的不太好,个人用过火狐,还可以,今天介绍一下Postman发送...
  • HTTP请求POST参数到底应该怎么传?

    万次阅读 多人点赞 2019-11-25 15:51:02
    接口请求现在基本上是应用必备了, 各个请求库用了这么多年从来没出什么岔子. 不过最近却产生了一点疑惑, 为什么之前用的好好的POST方法访问新接口时提示传递参数为空呢? 为什么网络上的接口请求测试工具中有两种...
  • POST的4种请求方式

    千次阅读 2018-12-06 15:06:13
    1 application/x-www-form-urlencoded 这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置...请求类似于下面这样(无关的请求头在本文中都省略掉了): POST http://www.example.com H...
  • Request Payload 请求头部的Content-Type: application/json,请求正文是一个 json 格式的字符串 Form Data 请求头部的Content-Type: application/x-www-form-urlencoded,请求正文是类似 get 请求 url 的请求参数 ...
  • 使用Jmeter发送post请求的两种方式

    万次阅读 2017-10-20 22:09:31
    之前我们有介绍过,常见的接口测试类型包括get型接口和post型接口。...而post型请求的参数不能随url...那么在Jmeter中如何发送post请求数据呢?根据post请求数据的格式,分两种情况进行介绍:map格式、json格式。 一、p
  • 浏览器模拟发送post请求

    万次阅读 2017-10-23 17:05:53
    需求:有时候提供接口API给别的模块使用,为了模拟测试,需要发送post请求来测试。 解决办法: 1.可以自己写代码,发送post请求,但是对于入参仅仅是个int等基本类型或者String,那么就不用大费周章,浏览器插件...
  • CURL 发送POST请求

    万次阅读 2019-07-02 16:28:05
    CURL 发送POST请求 curl -H "Content-Type: application/json" -X POST -d '{"user_id": "123", "coin":100, "success":1, "msg":"OK!" }' "http://192.168.0.1:8001/test" 参数 内容 -H 请求头 -d...
  • post 请求可以加?
  • postman为chrome浏览器的一个插件,用来模拟post请求,get请求等。可以在chrome浏览器里安装插件(前提是你得访问了Google应用商店)。 如果不能访问Google,那个下载一个postman的一个插件的客户端,功能是...
  • HTTP请求POST与GET的区别

    万次阅读 多人点赞 2014-04-18 17:31:48
    一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。 HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET,POST,...
  • XMLHttpRequest发送POST请求

    万次阅读 2016-05-07 14:57:21
    POST请求的适用性更广,可使用更大的请求参数,而且POST请求的请求参数通常不能直接看到。因此在使用Ajax发送请求时,尽量采用POST方式而不是GET方式发送请求。发送POST请求通常需要如下的三个步骤: 1) 使用open...
  • 像这种情况明明是post请求,但是在请求的url中拼接了参数 其实是在axios.create使用自定义配置新建一个 axios 实例用了params配置项 1. params会将请求的参数拼接到url中去,用于get请求 2. data是添加到请求体...
  • JS实现使用POST方式发送请求

    万次阅读 2017-05-18 15:37:58
    window.location.href是我们常用来在js中实现页面跳转的方法,这是使用get方式发送请求,示例如下window....下面我们来讲下如何通过POST请求实现页面跳转。//发送POST请求跳转到指定页面 function httpPost(URL,
1 2 3 4 5 ... 20
收藏数 771,832
精华内容 308,732
关键字:

post请求