根据HTTP 1.1.规格:
如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.
换句话说,PUT可用于创建和更新.更具体地说,如果我做一个PUT请求,例如
PUT /users/1
Run Code Online (Sandbox Code Playgroud)
并且该用户不存在,我希望此请求的结果是创建具有此ID的用户.但是,如果您的后端使用自动增量键,这将如何工作?如果它不可行(例如自动增量为6并且我请求10)并且如果可能(例如请求7)创建,那么它是否会简单地忽略它?
从我上面提到的片段看来它似乎给你这种灵活性,只是寻找一些澄清.
嗨,我有一个grails restful代码.我完善了Json get和delete请求.我的问题是:我想用json做一个Put或post请求,但是如果我用一个程序来做那个它有一个错误,我不能这样做!这是我的代码:一类:
package catalogo.json
class Catalogo {
String nombre
String descripcion
String url
Set <Parametros>parametros =[]
static hasMany = [parametros:Parametros]
int numeroParametros = parametros.size()
}
Run Code Online (Sandbox Code Playgroud)
和其他班级:
package catalogo.json
class Parametros {
String tipoParametro
String json
static constraints = {
tipoParametro(nullable:true)
json(nullable:true)
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何把我的json放在请求中.当我说出来时,这是错误的.
示例:
I PUT POST请求.身体application/json(或text/json同样的错误)Charset-utf-8
{"descripcion": "bla", "nombre" : "lalala", "numeroParametros":3, "parametros":[{
"tipoParametro":"string", "json":"bla"}],"url":"http://www.google.com"}
Run Code Online (Sandbox Code Playgroud)
这里的错误:
Could not create new Catalogo due to errors:
grails.validation.ValidationErrors: 3 errors
Field error in object 'catalogo.json.Catalogo' on …Run Code Online (Sandbox Code Playgroud) 我正在通过jQuery进行跨域请求$.ajax来访问RESTful PHP API.
为此,我在PHP中设置了以下标头:
header("HTTP/1.1 $code $status");
header('Content-type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT');
Run Code Online (Sandbox Code Playgroud)
使用类型GET和POST工作没有问题.但是,当我执行PUTajax调用时,Firefox完全失败并显示OPTIONS api.php在Firebug的网络选项卡中.
在Chrome中,首先发生同样的事情(OPTION请求失败并显示消息Method PUT is not allowed by Access-Control-Allow-Methods.),但Chrome会跟进实际可用的实际PUT请求.
这种行为的原因是什么?
我正在尝试使用AWS API Gateway和Lambda创建后端系统.
在过去的几天里,我为新的API资源创建了一个PUT方法,其中API Key是一个简单的第一个安全步骤.PUT方法在AWS上调用Lambda函数.
然后我将这个API部署到"prod"阶段进行一些测试.
在最初几天,一切都按预期运行良好:我用postman创建了一个API调用,我收到了我期待的所有数据.但前两天,我开始收到始终在429 "太多的请求"的响应.我也创建了一个新阶段,但没有任何改变:同样版本或更新版本的新阶段也总是会出现同样的错误.
该API不能达到任何限制,因为它们被称为每4或5次天,而不是每个第二(上CloudWatch的选中).没有循环,它只是一次调用.我认为lambda方面没有错误,因为如果我在AWS API网关控制台中测试API,我就不会收到任何错误(并且lambda过去运行良好,没有来自该版本的新更改).该错误仅显示当我使用外部客户端测试我的api时(在我的情况下它是Postman).
任何人都可以帮助解决这个问题吗?
更新:我刚刚在同一资源上创建了一个POST方法,具有相同的参数和相同的lambda.这是工作.我想知道问题是否与PUT方法有关,或者如果在2天内我的POST方法也会受到同样问题的影响.
对于 REST 和 ASP.NET Web API,即使 DTO 负载(例如 JSON)本身指定了标识符,是否也需要将标识符添加到 PUT 操作方法的路由中?
例如:
public void Put(int id, [FromBody]SomeDto someDto) // someDto has an 'Id' property
Run Code Online (Sandbox Code Playgroud)
ASP.NET Web API 模板包含该id参数,我见过很多这样的例子。
相比之下,是否可以省略该id参数并仍然遵守 REST 准则?例如:
public void Put([FromBody]SomeDto someDto)
Run Code Online (Sandbox Code Playgroud) HTTP PUT是否优于HTTP POST,特别是对于文件上载?数据传输应该是高度安全的.您对此的想法/指导将会有很大帮助.
我试图决定应该使用哪种Http方法PUT或POST.
在查看StackOverlflow上的一些帖子时,我可以看到这篇文章.
帖子中的答案之一说
PUT是幂等的,所以如果你将对象PUT两次,它就没有效果.这是一个很好的属性,所以我会尽可能使用PUT.
有人可以通过一个例子来帮助我.让我们说我有一个场景,我正在尝试创建一个学生,其条目将在RDBMS中的Student表中传递.
所以,如果我尝试一次又一次地输入那个条目会不会有效果?
我在我的应用程序中为Angular资源编写了一个自定义方法来激活用户.API端点是,/users/activate并且必须将激活码PUT到此端点.这就是我的资源:
app.factory('User', ['$resource',
function($resource){
return $resource('http://api.site.dev/users/:id', {id: '@id'}, {
activate: {method:'PUT', params:{code: '@code'}, url: 'http://api.site.dev/users/activate'}
});
}]);
Run Code Online (Sandbox Code Playgroud)
我正在我的控制器中使用它,如下所示:
User.activate({code: $routeParams.code});
Run Code Online (Sandbox Code Playgroud)
正如您在Chrome上的网络日志中所看到的,激活码正在查询字符串和请求正文中发送:

如何更改资源只是在请求正文中而不是在查询字符串中传递激活代码?
我正在使用Laravel作为API和Angularjs作为前端对一个Web应用程序进行编程。我有一个使用PUT方法更新产品的表格,其中包含一系列信息和一个文件作为产品图像。但是我无法在控制器中获得输入请求,它是空的。
请参见下面的代码:
web.php(路线)
Route::group(['prefix' => 'api'], function()
{
Route::put('products/{id}', 'ProductController@update');
});
Run Code Online (Sandbox Code Playgroud)
我的angularjs产品服务:
function update(productId, data, onSuccess, onError){
var formData = new FormData();
formData.append('imageFile', data.imageFile);
formData.append('image', data.image);
formData.append('name', data.name);
formData.append('category_id', data.category_id);
formData.append('price', data.price);
formData.append('discount', data.discount);
Restangular.one("/products", productId).withHttpConfig({transformRequest: angular.identity}).customPUT(formData, undefined, undefined, {'Content-Type': undefined}).then(function(response) {
onSuccess(response);
}, function(response){
onError(response);
}
);
}
Run Code Online (Sandbox Code Playgroud)
我的ProductController更新功能
public function update(Request $request, $id) {
// Just print the request data
dd($request->all());
}
Run Code Online (Sandbox Code Playgroud)
请分享您在此问题上的经验。谢谢。
我正在尝试使用Jmeter记录我的Web客户端 - 服务器通信.配置Jmeter和浏览器以记录应用程序之后.从客户端到服务器发出post请求时,会发生以下错误.知道如何编码正在记录的URL吗?
java.net.URISyntaxException: Illegal character in query at index 238: http://localhost:8080/updateBoxCorrectionInstantly?examKey=16-17-%3ECBSE-%3ETERM%20I-%3ESA1-%3EVI-%3EScience-%3EA&studentName=AMOGH%20YOGESH%20KALE&studentRollno=3&studentND=-1&sheetName=cb8e806b32e9d670698655e0d2da10e3_img001210.jpg&box={%22$center%22:%22(66.0,%202253.0)%22,%22$conf%22:%22H%22,%22$corrected%22:true,%22$isAdminCorrected%22:true,%22$correction%22:%22-%22,%22$isDrawn%22:false,%22coords%22:[36,2214,96,2292],%22isTitle%22:false,%22pos%22:%22-%22,%22pred%22:%22-%22,%22boxTypeId%22:0,%22score%22:1}
at java.net.URI$Parser.fail(URI.java:2829)
at java.net.URI$Parser.checkChars(URI.java:3002)
at java.net.URI$Parser.parseHierarchical(URI.java:3092)
at java.net.URI$Parser.parse(URI.java:3034)
at java.net.URI.<init>(URI.java:595)
at java.net.URL.toURI(URL.java:949)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:232)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1075)
at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:212)
Run Code Online (Sandbox Code Playgroud) put ×10
rest ×4
api ×2
post ×2
ajax ×1
angularjs ×1
aws-lambda ×1
cross-domain ×1
grails ×1
http ×1
http-verbs ×1
java ×1
javascript ×1
jmeter ×1
jquery ×1
json ×1
laravel ×1
request ×1
urlencode ×1