50.HTTPPost请求类型学前准备

50.网络通信-超文本传输HTTP-Post学前准备


50.1 知识点

Get 和 Post 的区别

主要用途

  • Get:一般用于从指定的资源请求数据,主要用于获取数据。
  • Post:一般用于向指定的资源提交想要被处理的数据,主要用于上传数据。

相同点

  • Get 和 Post 都可以传递一些额外的参数数据给服务端。

不同点

  • 在传递参数时,Post 相对于 Get 更加安全,因为 Post 看不到参数。Get 传递的参数都包含在连接中(URL资源定位地址),是暴露式的,而 Post 传递的参数放在请求数据中,不会出现在 URL 中,是隐藏式的。
  • Get 在传递数据时有大小的限制,因为它主要是在连接中拼接参数,而 URL 的长度是有限制的(最大长度一般为 2048 个字符),而 Post 在传递数据时没有限制。
  • 在浏览器中,Get 请求能被缓存,而 Post 不能缓存。
  • 传输次数可能不同:Get 建立连接——>请求行、请求头、请求数据一次传输——>获取响应——>断开连接,而 Post 建立连接——>传输可能分两次——>请求行,请求头第一次传输——>请求数据第二次传输——>获取响应——>断开。

对于前端来说,其实 Get 和 Post 都能够获取和传递数据,后端只要处理对应逻辑返回响应信息即可。但是由于它们的这些特点,我们在实际使用时建议 Get 用于获取,Post 用于上传。如果想要传递一些不想暴露在外部的参数信息,建议使用 Post,它更加安全。

Post 如何携带额外参数

关键点:将 Content-Type 设置为 application/x-www-form-urlencoded 键值对类型。

// 创建一个 HTTP 请求对象,指定目标 URL 地址
HttpWebRequest httpWebRequest = HttpWebRequest.Create("http://192.168.1.101:8000/HTTPRoot/") as HttpWebRequest;

// 设置 HTTP 请求方法为 POST
httpWebRequest.Method = WebRequestMethods.Http.Post;

// 设置请求的超时时间为 2 秒
httpWebRequest.Timeout = 2000;

// 设置请求的内容类型为 "application/x-www-form-urlencoded",表示要发送键值对类型的数据
httpWebRequest.ContentType = "application/x-www-form-urlencoded";

// 准备要上传的数据,这里是一个包含键值对的字符串
string str = "Name=MrTao&ID=2";

// 将字符串编码成字节数组,通常使用 UTF-8 编码
byte[] bytes = Encoding.UTF8.GetBytes(str);

// 设置请求的内容长度为字节数组的长度,以告知服务器请求体的大小
httpWebRequest.ContentLength = bytes.Length;

// 获取用于写入请求数据的流
Stream requestStream = httpWebRequest.GetRequestStream();

// 将字节数组写入请求流
requestStream.Write(bytes, 0, bytes.Length);

// 关闭请求流
requestStream.Close();

// 发送 HTTP 请求并获取响应结果
HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;

// 打印 HTTP 响应的状态码
print(httpWebResponse.StatusCode);

ContentType 的常用类型

ContentType 的构成:

  • 内容类型;charset=编码格式;boundary=边界字符串

例如

  • text/html;charset=utf-8;boundary=自定义字符串

其中内容类型有:

  • 文本类型 text:

    • text/plain 没有特定子类型就是它(重要)
    • text/html
    • text/css
    • text/javascript
  • 图片类型 image:

    • image/gif
    • image/png
    • image/jpeg
    • image/bm
    • image/webp
    • image/x-icon
    • image/vnd.microsoft.icon
  • 音频类型 audio:

    • audio/midi
    • audio/mpeg
    • audio/webm
    • audio/ogg
    • audio/wav
  • 视频类型 video:

    • video/webm
    • video/ogg
  • 二进制类型 application:

    • application/octet-requestStream 没有特定子类型就是它(重要)
    • application/x-www-form-urlencoded 传递参数时使用键值对形式(重要)
    • application/pkcs12
    • application/xhtml+xml
    • application/xml
    • application/pdf
    • application/vnd.mspowerpoint
  • 复合内容 multipart:

    • multipart/form-data 复合内容,有多种内容组合(重要)
    • multipart/byteranges 特殊的复合文件

关于 ContentType 更多内容可以前往 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type,关于媒体类型可以前往 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

ContentType 中对于我们来说重要的类型

  1. 通用二进制类型:application/octet-requestStream
  2. 通用文本类型:text/plain
  3. 键值对参数:application/x-www-form-urlencoded
  4. 复合类型(传递的信息有多种类型组成,比如有键值对参数,有文件信息等等,上传资源服务器时需要用该类型):multipart/form-data

总结

这节课的重点知识点是:

  1. Get 和 Post 的区别
  2. ContentType 的重要类型

注意:在 HTTP 通讯中,客户端发送给服务端的 Get 和 Post 请求都需要服务端和客户端约定一些规则进行处理,比如传递的参数的含义,数据如何处理等等,都是需要前后端程序制定对应规则来进行处理的。只是我们目前没有后端开发的 HTTP 服务器,所以我们传递过去的参数和数据没有得到对应处理,我们目前只针对 HTTP 资源服务器上传下载数据进行学习,他们的通讯原理是一致的,都是通过 HTTP 通讯交换数据。


50.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using UnityEngine;

public class Lesson50_网络通信_超文本传输HTTP_Post学前准备 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 Get和Post的区别

        //我们上节课学习的下载数据,主要使用的就是Get请求类型
        //我们在上传数据时将会使用Post请求类型
        //那么这两个请求类型他们的主要区别是什么呢?

        //1.主要用途
        //  Get — 一般从指定的资源请求数据,主要用于获取数据
        //  Post — 一般向指定的资源提交想要被处理的数据,主要用于上传数据

        //2.相同点
        //  Get和Post都可以传递一些额外的参数数据给服务端

        //3.不同点
        //  3-1:在传递参数时,Post相对Get更加的安全,因为Post看不到参数
        //      Get传递的参数都包含在连接中(URL资源定位地址),是暴露式的 ?参数名=参数值&参数名=参数值
        //      Post传递的参数放在请求数据中,不会出现在URL中,是隐藏式的
        //
        //  3-2:Get在传递数据时有大小的限制,因为它主要是在连接中拼接参数,而URL的长度是有限制的(最大长度一般为2048个字符)
        //      Post在传递数据时没有限制
        //
        //  3-3:在浏览器中Get请求能被缓存,Post不能缓存

        //  3-4:传输次数可能不同
        //      Get:  建立连接——>请求行、请求头、请求数据一次传输——>获取响应——>断开连接
        //      Post: 建立连接——>传输可能分两次——>请求行,请求头第一次传输——>请求数据第二次传输——>获取响应——>断开

        //对于前端来说,其实Get和Post都是能够获取和传递数据的,后端只要处理对应逻辑返回响应信息即可
        //但是由于他们的这些特点
        //我们在实际使用时建议Get用于获取,Post用于上传
        //如果想要传递一些不想暴露在外部的参数信息,建议使用Post,它更加的安全

        #endregion

        #region 知识点二 Post如何携带额外参数

        //关键点:将Content-Type设置为 application/x-www-form-urlencoded 键值对类型

        // 创建一个HTTP请求对象,指定目标URL地址
        HttpWebRequest httpWebRequest = HttpWebRequest.Create("http://192.168.1.101:8000/HTTPRoot/") as HttpWebRequest;

        // 设置HTTP请求方法为POST
        httpWebRequest.Method = WebRequestMethods.Http.Post;

        // 设置请求的超时时间为2秒
        httpWebRequest.Timeout = 2000;

        // 设置请求的内容类型为 "application/x-www-form-urlencoded",表示要发送键值对类型的数据
        httpWebRequest.ContentType = "application/x-www-form-urlencoded";

        // 准备要上传的数据,这里是一个包含键值对的字符串
        string str = "Name=MrTao&ID=2";

        // 将字符串编码成字节数组,通常使用UTF-8编码
        byte[] bytes = Encoding.UTF8.GetBytes(str);

        // 设置请求的内容长度为字节数组的长度,以告知服务器请求体的大小
        httpWebRequest.ContentLength = bytes.Length;

        // 获取用于写入请求数据的流
        Stream requestStream = httpWebRequest.GetRequestStream();

        // 将字节数组写入请求流
        requestStream.Write(bytes, 0, bytes.Length);

        // 关闭请求流
        requestStream.Close();

        // 发送HTTP请求并获取响应结果
        HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;

        // 打印HTTP响应的状态码
        print(httpWebResponse.StatusCode);


        #endregion

        #region 知识点三 ContentType的常用类型

        //ContentType的构成:
        //内容类型;charset=编码格式;boundary=边界字符串

        //例如
        //text/html;charset=utf-8;boundary=自定义字符串

        //其中内容类型有:
        //文本类型text:
        //text/plain 没有特定子类型就是它(重要)
        //text/html
        //text/css
        //text/javascript

        //图片类型image:
        //rawImage/gif
        //rawImage/png
        //rawImage/jpeg
        //rawImage/bm
        //rawImage/webp
        //rawImage/x-icon
        //rawImage/vnd.microsoft.icon

        //音频类型audio:
        //audio/midi
        //audio/mpeg
        //audio/webm
        //audio/ogg
        //audio/wav

        //视频类型video:
        //video/webm
        //video/ogg

        //二进制类型application:
        //application/octet-requestStream 没有特定子类型就是它(重要)
        //application/x-www-form-urlencoded 传递参数时使用键值对形式(重要)
        //application/pkcs12
        //application/xhtml+xml
        //application/xml
        //application/pdf
        //application/vnd.mspowerpoint

        //复合内容multipart:
        //multipart/form-data  复合内容,有多种内容组合(重要)
        //multipart/byteranges  特殊的复合文件

        //关于ContentType更多内容可以前往
        //https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type
        //关于媒体类型可以前往
        //https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

        #endregion

        #region 知识点四 ContentType中对于我们来说重要的类型

        //1.通用2进制类型
        //application/octet-requestStream

        //2.通用文本类型
        //text/plain 

        //3.键值对参数
        //application/x-www-form-urlencoded

        //4.复合类型(传递的信息有多种类型组成,比如有键值对参数,有文件信息等等,上传资源服务器时需要用该类型)
        //multipart/form-data

        #endregion

        #region 总结

        //这节课的重点知识点是
        //1.Get和Post的区别
        //2.ContentType的重要类型

        //注意:
        //HTTP通讯中
        //客户端发送给服务端的Get和Post请求都需要服务端和客户端约定一些规则进行处理
        //比如传递的参数的含义,数据如何处理等等,都是需要前后端程序制定对应规则来进行处理的
        //只是我们目前没有后端开发的HTTP服务器,所以我们传递过去的参数和数据没有得到对应处理
        //我们目前只针对HTTP资源服务器上传下载数据进行学习
        //他们的通讯原理是一致的,都是通过HTTP通讯交换数据

        #endregion
    }
}

50.3 练习题

请简述Get和Post两种请求类型的区别

  • Get和Post的区别:

    • 在传递参数时,Post相对Get更加的安全,因为Post看不到参数
    • Get传递的参数都包含在连接中(URL资源定位地址),是暴露式的
    • Post传递的参数放在请求数据中,不会出现在URL中,是隐藏式的
    • Get在传递数据时有大小的限制,因为它主要是在连接中拼接参数,而URL的长度是有限制的(最大长度一般为2048个字符)
    • Post在传递数据时没有限制
    • 在浏览器中Get请求能被缓存,Post不能缓存
    • 传输次数可能不同
      • Get: 建立连接——>请求行、请求头、请求数据一次传输——>获取响应——>断开连接
      • Post: 建立连接——>传输可能分两次——>请求行,请求头第一次传输——>请求数据第二次传输——>获取响应——>断开

请说出application/octet-stream,text/plain,application/x-www-form-urlencoded,multipart/form-data,四种内容类型,是用于发送哪种数据的?

  • application/octet-stream:通用2进制数据
  • text/plain:通用文本数据
  • application/x-www-form-urlencoded:键值对参数数据
  • multipart/form-data:复合类型数据,多种数据的组合


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏