它们似乎都在向身体内部的服务器发送数据,那么它们有什么不同呢?


当前回答

实际上,除了他们的头衔之外,没有什么不同。GET和其他方法之间实际上有一个基本的区别。使用“GET”-Request方法,发送url地址行中的数据,首先用问号分隔,然后用&符号分隔。

但是使用“POST”-request方法,您不能通过url传递数据,而是必须将数据作为请求的所谓“主体”中的对象传递。在服务器端,您必须读取接收到的内容正文,以便获得发送的数据。 但另一方面,当你发送"GET"-Request时,就不可能在body中发送内容。

“GET”只用于获取数据而“POST”用于发布数据的说法是绝对错误的。没有人可以阻止你创建新的内容,删除现有的内容,编辑现有的内容或做任何在后端,基于数据,这是由“GET”请求或由“POST”请求发送。没有人能阻止你在后端编码,用一个"POST"-Request,客户端请求一些数据。

对于请求,无论使用哪种方法,您都调用URL并发送或不发送一些数据来指定,您希望将哪些信息传递给服务器以处理您的请求,然后客户端从服务器获得一个答案。数据可以包含你想要发送的任何东西,后端可以对数据做任何它想做的事情,响应可以包含任何你想要放在那里的信息。

只有这两个基本方法。GET和POST。但使它们不同的是它们的结构,而不是你在后端编写的代码。在后端,您可以使用接收到的数据编写任何您想要的代码。但是使用“POST”请求,你必须在正文中发送/检索数据,而不是在url-addressline中,而使用“GET”请求,你必须在url-addressline中发送/检索数据,而不是在正文中。这是所有。

所有其他的方法,比如"PUT", "DELETE"等等,它们都有和"POST"相同的结构。

如果你想隐藏一些内容,POST方法主要被使用,因为无论你在url-addressline中写什么,这都将被保存在缓存中,GET-Method与用数据写url-addressline是一样的。因此,如果你想发送敏感数据,不一定总是用户名和密码,但例如一些id或哈希,你不希望显示在url地址行,那么你应该使用POST方法。

此外,URL-Addressline的长度被限制为1024个符号,而“POST”-方法则不受限制。因此,如果数据量较大,则可能无法使用GET-Request发送数据,而需要使用POST-Request。这也是post请求的另一个优点。

但是当您没有复杂的文本要发送时,处理get请求要容易得多。 否则,这是POST方法的另一个优点,使用get方法,您需要对文本进行url编码,以便能够在文本甚至空格中发送一些符号。但是使用POST方法没有任何限制,您的内容不需要以任何方式更改或操作。

其他回答

根据HTTP方法定义操作

HTTP协议定义了许多为请求分配语义的方法。大多数RESTful web api使用的常见HTTP方法有:

GET在指定URI处检索资源的表示形式。响应消息的主体包含所请求资源的详细信息。

POST在指定的URI上创建一个新资源。请求消息的主体提供了新资源的详细信息。注意,POST还可以用于触发不实际创建资源的操作。

PUT在指定的URI上创建或替换资源。请求消息的主体指定要创建或更新的资源。

PATCH执行资源的部分更新。请求体指定要应用于资源的更改集。

DELETE删除指定URI上的资源。

特定请求的效果应取决于资源是集合还是单个项。下表通过电子商务示例总结了大多数RESTful实现采用的常见约定。并不是所有这些请求都可以实现——这取决于具体的场景。

Resource POST GET PUT DELETE
/customers Create a new customer Retrieve all customers Bulk update of customers Remove all customers
/customers/1 Error Retrieve the details for customer 1 Update the details of customer 1 if it exists Remove customer 1
/customers/1/orders Create a new order for customer 1 Retrieve all orders for customer 1 Bulk update of orders for customer 1 Remove all orders for customer 1

POST、PUT和PATCH之间的区别可能令人困惑。

POST请求创建一个资源。服务器为新资源分配URI,并将该URI返回给客户端。在REST模型中,您经常对集合应用POST请求。新资源被添加到集合中。POST请求还可以用于将数据提交到现有资源进行处理,而不需要创建任何新资源。

A PUT request creates a resource or updates an existing resource. The client specifies the URI for the resource. The request body contains a complete representation of the resource. If a resource with this URI already exists, it is replaced. Otherwise, a new resource is created, if the server supports doing so. PUT requests are most frequently applied to resources that are individual items, such as a specific customer, rather than collections. A server might support updates but not creation via PUT. Whether to support creation via PUT depends on whether the client can meaningfully assign a URI to a resource before it exists. If not, then use POST to create resources and PUT or PATCH to update.

PATCH请求对现有资源执行部分更新。客户端为资源指定URI。请求体指定要应用于资源的一组更改。这可能比使用PUT更有效,因为客户端只发送更改,而不是资源的整个表示。从技术上讲,如果服务器支持的话,PATCH还可以创建一个新资源(通过指定一组对“null”资源的更新)。

PUT请求必须是等幂的。如果客户端多次提交相同的PUT请求,结果应该总是相同的(相同的资源将被修改为相同的值)。POST和PATCH请求不能保证是等幂的。

POST和PUT之间的区别在于PUT是幂等的,这意味着多次调用相同的PUT请求总是会产生相同的结果(没有副作用),而另一方面,重复调用POST请求可能会产生多次创建相同资源的(额外的)副作用。

GET:使用GET的请求只检索数据,也就是说它请求指定资源的表示

POST:向服务器发送数据以创建资源。请求体的类型由Content-Type报头表示。它通常会导致服务器的状态变化或副作用

PUT:创建一个新资源或用请求有效负载替换目标资源的表示

PATCH:用于对资源应用部分修改

DELETE:删除指定资源

TRACE:它沿着通往目标资源的路径执行消息循环测试,提供了一种有用的调试机制

OPTIONS:用于描述目标资源的通信选项,客户端可以为OPTIONS方法指定一个URL,或者一个星号(*)来引用整个服务器。

HEAD:它请求与GET请求相同的响应,但没有响应体

CONNECT:它建立到目标资源标识的服务器的隧道,可用于访问使用SSL (HTTPS)的网站

POST被认为是某种工厂类型的方法。您将数据包含在其中以创建您想要的内容,而另一端的任何内容都知道如何使用它。PUT用于更新给定URL上的现有数据,或者当您知道URI将是什么并且它还不存在时创建一些新的东西(与POST相反,POST将创建一些东西并在必要时返回URL)。

只有语义。

HTTP PUT应该接受请求体,然后将其存储在由URI标识的资源中。

HTTP POST更为通用。它应该在服务器上发起一个操作。该操作可以是将请求体存储在由URI标识的资源中,也可以是不同的URI,也可以是不同的操作。

PUT类似于文件上传。对URI的put操作恰好影响该URI。对URI的POST可以产生任何效果。

值得一提的是,POST容易受到一些常见的跨站请求伪造(CSRF)攻击,而PUT则不会。

当受害者访问attackersite.com时,下面的CSRF是不可能的。

攻击的效果是,受害者无意中删除一个用户,只是因为它(受害者)在访问attackersite.com之前以admin身份登录target.site.com:

attackersite.com上的恶意代码:

案例1:正常请求。保存的target.site.com cookie将自动由浏览器发送:(注意:只支持PUT,在端点,是更安全的,因为它是不支持<form>属性值)

<!--deletes user with id 5-->
<form id="myform" method="post" action="http://target.site.com/deleteUser" >
    <input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>

案例2:XHR请求。保存的target.site.com cookie将被浏览器自动发送:(注意:只支持PUT,在端点,是更安全的,因为尝试发送PUT将触发一个preflight请求,其响应将阻止浏览器请求deleteUser页面)

//deletes user with id 5
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);

MDN Ref: [..]与“简单请求”(上面讨论过)不同,——[[意思是:POST/GET/HEAD]]——,对于“预飞行”请求,浏览器首先使用OPTIONS方法发送一个HTTP请求[..]

Cors在行动:[..]某些类型的请求,如DELETE或PUT,在发出实际请求之前需要进一步请求服务器的许可。]所谓的飞行前请求[..]