首页 > 其他分享 >HTTP

HTTP

时间:2024-10-08 20:24:35浏览次数:7  
标签:HTTP 请求 Content 响应 服务器 报头 客户端

http post 传送文件详解(转载)

首先客户端链接 192.168.24.56 后, 应该发送如下 http 请求:

POST/logsys/home/uploadIspeedLog!doDefault.html HTTP/1.1

Accept: text/plain, _/_
Accept-Language: zh-cn
Host: 192.168.24.56
Content-Type:multipart/form-data;
boundary=-----------------------------7db372eb000e2
User-Agent: WinHttpClient
Content-Length: 3693
Connection: Keep-Alive
-------------------------------7db372eb000e2
Content-Disposition: form-data; name="file"; filename="kn.jpg"
Content-Type: image/jpeg
(此处省略 jpeg 文件二进制数据...)
-------------------------------7db372eb000e2--

此内容必须一字不差,包括最后的回车,红色字体部分就是协议的头。给服务器上传数据时,并非协议头每个字段都得说明,其中,content-type是必须的,它包括一个类似标志性质的名为boundary的标志,它可以是随便输入的字符串。对后面的具体内容也是必须的。它用来分辨一段内容的开始。Content-Length:
3693 ,这里的 3693 是要上传文件的总长度。绿色字体部分就是需要上传的数据,可以是文本,也可以是图片等。数据内容前面需要有 Content-Disposition, Content-Type 以及 Content-Transfer-Encoding 等说明字段。最后的紫色部分就是协议的结尾了。

注意这一行

Content-Type: multipart/form-data; boundary=---------------------------7db372eb000e2

根据 rfc1867, multipart/form-data 是必须的. 

---------------------------7db372eb000e2  是分隔符,分隔多个文件、表单项。其中 b372eb000e2是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。Form 每个部分用分隔符分割,分隔符之前必须加上"--"着两个字符(即--{boundary})才能被 http 协议认为是 Form 的分隔符,表示结束的话用在正确的分隔符后面添加"--"表示结束。

前面的 ---------------------------7dIE 特有的标志,Mozila---------------------------71

每个分隔的数据的都可以用 Content-Type 来表示下面数据的类型,可以参考 rfc1341 (http://www.ietf.org/rfc/rfc1341.txt)

例如Contect-Type:image/jpeg 表示下面的数据是 jpeg 文件数据

转载http://www.cnblogs.com/liangbin/articles/2117288.html

*******

HTTP 响应

在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。

HTTP 请求类似,HTTP 响应也是三个部分组成,分别是:

状态行、消息报头、响应正文。

状态行:  

状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

格式: HTTP-Version Status-Code Reason-Phrase CRLF

例如: HTTP/1.1 200 OK \r\n

状态代码:  

状态代码由 3 位数字组成,表示请求是否被理解或被满足。

状态描述:  

状态描述给出了关于状态代码的简短的文字描述。  

状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。  

第一个数字有五种可能的取值:  

  • 1xx:     指示信息—表示请求已接收,继续处理。
  • 2xx:     成功—表示请求已经被成功接收、理解、接受。
  • 3xx:     重定向—要完成请求必须进行更进一步的操作。
  • 4xx:     客户端错误—请求有语法错误或请求无法实现。
  • 5xx: 服务器端错误—服务器未能实现合法的请求。
状态代码 状态描述 说明
200 OK 客户端请求成功
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthonzed 请求未经授权。这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的 URL
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

HTTP消息

HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行,消息报头(可选的),空行(只有CTLF的行),消息正文(可选的)组成。

对于请求消息,开始行就是请求行。

对于响应消息,开始行就是状态行。

消息报头

HTTP 消息报头包括普通报头、请求报头、响应报头、实体报头。

每一个报头域都是由(名字+":"+空格+值)组成,消息报头域的名字是大小写无关的。

普通报头

在普通报头中,有少数报头域应用于所有的请求和响应消息,但并不用于被传输的实体,这些报头域只用于传输的消息。

常用的普通报头域:Cache-Control,Date,Connection,Pragma.

请求报头

请求报头允许客户端向服务器端传递该请求的附加信息以及客户端自身的信息。

常用的请求报头域:

Accept

  • Accept请求报头域用语指定客户端接受哪些类型的信息。例如:Accept: image/gif,表明客户端希望接受GIF图象格式的资源;Accept: text/html,表明客户端希望接受html文本

Accept-Charset

  • Accept-Charset请求报头域用于指定客户端接受的字符集。例如:Accept-Charset: ios-8859-1,gb2312。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

Accept-Encoding

  • Accept-Encoding请求报头域类似Accept,但是它是用于指定可接受的内容编码。例如:Accept-Encoding: gzip, deflate。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可接受。

Accept-Language

  • Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。例如:Accept-Language: zh-cn。如果请求消息中没有设置这个域,服务器假定客户端对各种语言都可接受。

Authorization

  • Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要服务器对其进行验证。

Host

相关文章

  • 使用apatch httpClient, 并且我用了try-with-resource, 我希望在catch 和 finally 中从
    在使用ApacheHttpClient时,如果你使用了try-with-resources语法并希望在catch或finally块中从response对象中读取完整的responseentity,你可能会遇到资源过早关闭的问题。这是因为try-with-resources会在try块结束后自动关闭资源,导致在catch或finally块中无法......
  • CloseableHttpResponse当程序进入 catch 块的情况下,就不得不在catch 中获取entity,这
    如果程序进入catch块时还需要获取responseentity,但此时try-with-resources会自动关闭资源,导致无法再从response中获取数据,这种情况下,你可以避免在try-with-resources中立即关闭CloseableHttpResponse,并延迟处理资源的关闭。为了解决这个问题,下面是几种可行的方式:1.......
  • 那么给apatch HttpClient 加连接池,有助于解决我的问题吗
    使用连接池(connectionpool)对ApacheHttpClient的确能够提升性能,但对于你遇到的问题——在catch或finally块中读取完整的responseentity,连接池本身不会直接解决这个问题。连接池的主要作用是提升网络连接的复用效率,减少频繁建立和关闭连接的开销,从而提高应用程序的性能和......
  • 使用 Apatch HttpRequest 的情况下,使用 HttpRequest.execute 方法, 假如该方法抛出了
    在使用ApacheHttpClient时,如果调用HttpRequest.execute()抛出了异常,通常情况下,异常不会直接包含完整的responseentity。特别是当服务器返回错误响应(如4xx或5xx状态码)时,execute()方法可能抛出各种类型的IOException或HttpResponseException,但这些异常并不一定会携带......
  • CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&
    CentOS报错:Couldnotretrievemirrorlisthttp://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock32errorwas14:curl#6-"Couldnotresolvehost:mirrorlist.centos.org;Unknownerror"关于CentOS报错:Couldnotretrievemirr......
  • [Http] 跨站请求伪造(CSRF)
    基本概念当一个用户已经登录并且在当前域名下存储了相关的Cookie(如身份验证信息等),如果打开一个伪造的HTML页面,并且该页面中的<form>元素的action属性包含完整的API请求全路径指向同一域名,浏览器在发送该表单请求时会自动携带该域名下存储的Cookie。同一域名下的所有请......
  • [Http] 跨源资源共享(CORS)
    基本概念CORS指的是跨源资源共享(Cross-OriginResourceSharing),默认情况下不允许从一个源(即一个域名、协议、端口号组合)加载页面执行跨源HTTP请求。也就是说,不允许A.com请求B.com的资源,通常发生在前后端分离项目,前端项目部署的服务器和后端部署的服务器不同源。举个例......
  • 为什么安装了SSL证书还是不能HTTPS访问?
    安装了SSL证书后仍然无法通过HTTPS访问网站可能有以下几个原因:证书未正确配置:确保在服务器上正确安装并配置了SSL证书。这包括将证书文件正确放置,并在服务器软件中启用HTTPS。域名不匹配:检查SSL证书绑定的域名是否与实际访问的域名一致。如果访问的域名不在证书覆盖范围内,则......
  • 使用yum安装报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea
    安装wget命令yum-yinstallwget报错,无法找到镜像 测试是否是网络问题抓包正常,网络没有问题;尝试更新yum又开始报错尝试分析问题原因出现这个错误是因为使用的CentOS7仓库已经被归档,当前的镜像地址无法找到所需的文件。CentOS7的官方支持已经结束,部分仓库已被移至归档......
  • 如何解决 构建dotnet docker镜像时报错:error NU1301: Unable to load the service ind
    我用的是dockerdesktop,Builders设置:desktop-linux以下是我的dotnet项目的Dockerfile内容FROMmcr.microsoft.com/dotnet/aspnet:6.0ASbaseWORKDIR/appEXPOSE80EXPOSE443FROMmcr.microsoft.com/dotnet/sdk:6.0ASbuildWORKDIR/srcCOPY["NuGet.Config","......