将POST数据发送到不接受发布数据的服务器是否会接收数据?

时间:2009-10-20 06:56:19

标签: http api post

我正在我的脚本中设置一个后端API,它通过以POST数据的形式将XML发送到我的Web服务器来联系我的一个站点。这个脚本将被许多人使用,我想限制在没有适当的访问密钥的情况下意外打开该功能的人的带宽浪费。

我将通过生成403访问代码来拒绝没有正确访问密钥的请求。

让我们说POST数据是~500kb的数据。无论状态代码如何,服务器是否都会接收所有500kb的数据?

如果我将url包含密钥mydomain / api / 123456789并在所有错误访问密钥上生成403状态,该怎么办。

在数据最终发送之前,POST数据是否仍然被发送/接收,或者是否已经协商。

提前致谢!

2 个答案:

答案 0 :(得分:2)

一般来说,将发送整个请求 ,包括发布数据。在收到整个请求之前,应用层通常无法返回类似403的响应。

实际上,它将取决于所使用的语言/框架以及它与HTTP服务器的链接程度。 Section 8.2.2 of RFC2616 HTTP/1.1 specification有这个说法

  

HTTP / 1.1(或更高版本)客户端发送   消息体应该监视   网络连接的错误状态   而它正在传输请求。   如果客户端看到错误状态,则为   应该立即停止传播   身体。如果正在发送尸体   使用“分块”编码(部分   3.6),零长度块和空拖车可能过早使用   标记消息的结尾。如果   body之前是Content-Length   标题,客户端必须关闭   连接。

因此,如果您能找到与HTTP服务器紧密相关的语言环境(例如,mod_perl),您可以采用符合标准的方式执行此操作。

您可以采取的另一种方法是发出初始的较小请求,以获取用于较大POST的URL。然后,应用程序可以拒绝在没有适当密钥的情况下向客户端提供URL。

答案 1 :(得分:0)

这是关于RESTful Web服务的好书,它解释了HTTP的工作原理:http://oreilly.com/catalog/9780596529260

您可以将任何请求视为信封,其中最重要的是它的写入地址(URL),一些属性(HTTP标头),其中有一些数据(如果请求是由post方法启动的)。所以你可能猜到你不能部分收到信封。

哦,我忘记了,当你使用带有标准HTTP标头“application / x-www-form-urlencoded”的HTTP Post时,如果你要上传文件(相应地使用“”multipart / form-data“),Django会给你使用中间件类控制流式文件块:http://docs.djangoproject.com/en/dev/topics/http/middleware/