我制作了一个演示应用程序,rails new demo
然后生成了一个脚手架用户控制器rails generate scaffold User name:string email:string
.脚手架代码中有一个ApplicationController
用protect_from_forgery
,所以不会UserController
从派生ApplicationController
.
我运行webrick,添加一个用户,很酷.真实性令牌的工作方式与/ on上的POST一致.
然而,仍然使用Rails 3.0.5我能够做到:
niedakh@twettek-laptop:~$ telnet 10.0.0.4 3000
PUT /users/3 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
user[name]=vvvvv&user[email]=shiaus.pl
Run Code Online (Sandbox Code Playgroud)
并且在不给出令牌的情况下修改用户3:
Started PUT "/users/3" for 10.0.0.4 at 2011-04-02 14:51:24 +0200
Processing by UsersController#update as HTML
Parameters: {"user"=>{"name"=>"vvvvv", "email"=>"shiaus.pl\r"}, "id"=>"3"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
', "updated_at" = '2011-04-02 12:51:24.437267' WHERE "users"."id" = 3s.pl
Redirected to http://10.0.0.4:3000/users/3 …
Run Code Online (Sandbox Code Playgroud) 我想使用适合以下场景的适当方法来设计我的休息端点。
有一个团体。每个小组都有成员。会员必须经过群管理员批准才能成为会员。如果管理员拒绝,用户将无法成为该组的成员。
我有以下端点来解决这种情况。
当用户加入群组时
POST /projects/api/v1/projects/{project id}/members/{member id}
用于
PUT /groups/api/v1/groups/{group id}/members/{member id}/approve
批准会员资格
但是,我无法确定拒绝会员资格的正确端点。我应该使用
PUT /projects/api/v1/projects/{project id}/members/{member id}/reject
Run Code Online (Sandbox Code Playgroud)
或者
DELETE /projects/api/v1/projects/{project id}/members/{member id}
Run Code Online (Sandbox Code Playgroud) 正如在"RESTful"设置中使用HTTP方法登录和注销操作所接受的答案所述,建议在RESTful Web服务(例如/webservice/login/
)中使用HTTP POST(= create)进行登录.POST既不是幂等的也不是安全的(http://restcookbook.com/HTTP%20Methods/idempotency/).
但是如何注销(例如/ webservice/logout /).我应该使用POST还是DELETE?
DELETE是幂等的 - 无论服务器上是否存在会话(或其他),它都会被删除,并且来自网络服务器的答案没有任何进一步的内容.这对我来说有点自然.
POST不是幂等的,类似问题的一些海报建议POST用于REST注销.我可以想到两个可能的原因:
如果会话不存在,服务器可能会返回404 - 否则成功答案(两种答案)
注销可以触发例如包含用户等的注销信息的数据库更新,因此注销操作不是幂等的
那么哪种HTTP方法更适合注销 - POST或DELETE?
DELETE 方法在 IIS 10 中显示以下错误
请求的资源上不存在“Access-Control-Allow-Origin”标头。
所有其他方法(如 POST 和 GET)都可以正常工作。此外,DELETE 在开发时在 iis express 中运行良好。我为 WebApiConfig 类中的所有请求启用了 cors
public static void Register(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
我的网络配置看起来像这样
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=301879 --> <configuration> <configSections>
<!-- For more information on Entity Framework …
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现基本用户注册RESTful api.我有一个html表单registerform.html,deregisterform.html,users.php,register.php和deregister.php,它们都粘贴在下面.
当我在浏览器中访问registerform.html时,我可以填写详细信息,users.php脚本会收到一个POST请求,并回显一个json响应,显示刚刚添加的用户的id号.我的问题是,当我使用deregister表单时,users.php脚本应该重新发送DELETE请求,但实际上是获取GET请求.我一直在寻找这个问题的答案,但我找不到解决方案.
registerform.html
<form action="users.php" method="POST">
Username: <input type="text" name="uname" /><br />
FirstName: <input type="text" name="fname" /><br />
Last Name: <input type="text" name="lname" /><br />
Date of Birth: <input type="date" name="dob" /><br />
Telephone: <input type="mob" name="tel" /><br />
Email: <input type="email" name="email1" /><br />
Confirm Email: <input type="email" name="email2" /><br />
Password: <input type="password" name="pass1" /><br />
Confirm Password: <input type="password" name ="pass2" /><br />
<input type="submit" value="Register" name="sub" />
<br/><A HREF="login.php">Already Registered? Login Here</A><br/>
</form>
Run Code Online (Sandbox Code Playgroud)
deregisterform.html
我有管理资源的 REST 服务EASYPAY
..此时此服务公开了 3 种不同的方法:
GET
);POST
);PUT
)。当我插入或更新请求时,我还必须trace
在数据库的表中插入一行。
现在我必须删除一个 Easypay 请求,我还必须在跟踪表上添加一行。我想使用DELETE
HTTP 动词,但我看到使用 delete 我不能传递复杂的对象,而只能传递要删除的请求的 ID。我不能使用PUT
HTTP 动词,因为我已经使用过它,无论如何它在概念上都不正确......我不想做更多的从客户端到服务器的调用(一个用于删除请求,另一个用于删除请求)在跟踪表中添加一行)..所以我不知道如何解决问题。
编辑
我试着解释得更好......我有一个部署在两个不同服务器上的网站。一种用于前端,一种用于后端。后端只为前端公开一些 REST 服务,它无法访问互联网(只能访问内部网)。访问该网站的客户可以通过名为 XPAY 的系统进行付款,它的工作方式与 paypal 非常相似(XPAY 只是另一个虚拟 POS)。因此,当客户尝试付款时,我会在数据库中保存一些信息 + 跟踪付款尝试,然后将他重定向到 XPAY。在那里,他可以付款。最后,XPAY 返回网站(前端)向我们传达付款结果。结果在支付的 URL 中,所以我必须把 URL 中的所有信息都发送到后端。根据结果,
你有什么建议?
谢谢
我正试图弄清楚如何使用Javascript来发出DELETE请求.我有一个用Java Spring编写的服务,其中我正在处理的url的控制器method = RequestMethod.DELETE
.我的网址是,比如说http://192.168.50.51/my-service/deleteLocation/{value1}/{value2}/{value3}
.在我的JavaScript中,我有一个像这样的AJAX函数:
ajaxFunction : function(url, callback, httpMethod) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
var jsonParse = JSON.parse(xhttp.responseText);
callback(jsonParse);
}
}
xhttp.open(httpMethod, url, true);
xhttp.send();
}
Run Code Online (Sandbox Code Playgroud)
当我想使用DELETE
url时,我有一个事件处理程序附加到运行此方法的按钮:
deleteConfirm : function() {
var valuel = this.value1;
var value2 = document.getElementById('element-id').getAttribute('data-element');
var value3 = document.getElementById('element-id').getAttribute('data-element2');
var url = 'http://192.168.50.51/my-service/deleteInfo/' + value1 + '/' + value2 + '/' + value3;
var httpMethod = …
Run Code Online (Sandbox Code Playgroud) 我有一个id的数组,我想附加到删除请求.我该如何将params附加到url请求?
var deleteArray = ['1','5','6'];
如果我想以这种格式发送请求http:// localhost/xxx/employees?ids = 1&ids = 5&ids = 6 for delete
如何解析数组内容以构建用于删除的请求URL 的ids = 1&ids = 5&ids = 6?
我关注的是"&",我怎么能追加"&并在javascript中为url请求构建字符串
我有一个名为的模型Profile
,它是 Django 模型的包装器User
。ProfileSerializer
现在,我通过以下方式创建了一个:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name', 'last_name', 'email', 'password')
class ProfileSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User.objects.create_user(**user_data, username=validated_data.get('username'))
profile = Profile.objects.create(user=user, **validated_data)
return profile
def update(self, instance, validated_data):
instance.dob = validated_data.get('dob', instance.dob)
instance.karma = validated_data.get('karma', instance.karma)
instance.username = validated_data.get('username', instance.username)
user_data = validated_data.pop('user')
instance.user.first_name = user_data.get('first_name', instance.user.first_name)
instance.user.last_name = user_data.get('last_name', instance.user.last_name)
instance.user.email = user_data.get('email', instance.user.email)
instance.user.username = instance.username
new_password = user_data.get('password') …
Run Code Online (Sandbox Code Playgroud) 我制作了一个 Web 应用程序,允许用户添加编辑和删除文章。我遇到的问题是删除方法不起作用。当我点击想要删除的文章旁边的“删除”时,什么也没有发生,我也没有收到任何错误。我认为它充当 GET 方法而不是 DELETE 方法,但我不知道为什么它不起作用。
任何帮助将不胜感激!
文章_controller.rb
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_path
end
Run Code Online (Sandbox Code Playgroud)
index.html.erb
<tbody>
<% @articles.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.description %></td>
<td><%= link_to 'Show', article_path(article) %></td>
<td><%= link_to 'Edit', edit_article_path(article) %></td>
<td><%= link_to 'Delete', articles_path(article), method: :delete, data: {confirm: "Are you sure?"} %></td>
</tr>
<% end %>
Run Code Online (Sandbox Code Playgroud)
单击删除时的控制台:
Started GET "/articles.5" for ::1 at 2020-03-26 16:45:32 +0000
Processing by ArticlesController#index as
Rendering articles/index.html.erb within layouts/application
Article Load (0.4ms) SELECT …
Run Code Online (Sandbox Code Playgroud) 我使用来自使用XMLHttpRequest发送POST数据的示例来创建此JavaScript代码:
function PostXML(webURL, post_data) {
var objHTTP = new ActiveXObject("MSXML2.XMLHTTP");
objHTTP.open("POST", webURL, false);
objHTTP.setRequestHeader("Content-Type", "application/xml; charset=utf-8");
objHTTP.setRequestHeader("Accept", "application/xml; charset=utf-8");
objHTTP.setRequestHeader("Content-Length", post_data.length);
objHTTP.send(post_data);
while((objHTTP.readyState != 4) && (objHTTP.readyState != 'complete')) {
Delay(100);
}
if(200 != objHTTP.Status) {
Log.Message("Returned Status Code of: " + objHTTP.Status);
Log.Message("Status Text: " + objHTTP.StatusText);
}
else {
Log.Message("Returned Status Code of: " + objHTTP.Status);
}
return objHTTP.responseText;
}
Run Code Online (Sandbox Code Playgroud)
我也需要PUT
和DELETE
东西.如何传输此代码才能使用PUT
,以及如何传输此代码以便能够执行此操作DELETE
?
任何其他同样有效的例子也很好.
http-delete ×11
rest ×5
http ×4
http-put ×3
javascript ×3
httprequest ×2
ajax ×1
complextype ×1
cors ×1
django ×1
html ×1
http-method ×1
http-post ×1
iis ×1
iis-10 ×1
php ×1
put ×1
xml ×1