我正在为我们的应用程序开发一个新的RESTful Web服务.
在某些实体上执行GET时,客户端可以请求实体的内容.如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数.
或者,我希望人们能够在请求正文中指定这些参数. HTTP/1.1似乎没有明确禁止这一点.这将允许他们指定更多信息,可以更容易指定复杂的XML请求.
我的问题:
发出HTTP DELETE请求时,请求URI应完全标识要删除的资源.但是,是否允许添加额外的元数据作为请求的实体主体的一部分?
我的情况是我正在建模"您确定要删除它吗?" 场景.在某些情况下,资源的状态表明请求的删除可能无效.你可以想象一些自己需要确认删除的场景
我们采用的解决方案是将参数传递给删除请求以指示可以继续删除("?force_delete = true")
例如
DELETE http://server/resource/id?force_delete=true
Run Code Online (Sandbox Code Playgroud)
我相信它仍然是宁静的:
(a)DELETE的语义没有被改变 - 用户仍然可以发送正常的DELETE请求,但这可能会失败,409响应的主体将解释原因.我说可能会失败,因为(出于不值得解释的原因)在某些情况下没有理由提示用户.
(b)Roy的论文中没有任何内容表明它违背了REST的精神 - 为什么会有,因为HTTP只是REST的一个实现,所以为什么传递HTTP参数很重要
有人能指出一个明确的陈述,指出为什么这不是RESTful?
在一个相关的问题上,如果用户没有指定force_delete然后我正在返回409 Conflict- 这是最合适的响应代码吗?
经过一些进一步的研究,我认为向DELETE添加参数可能违反了几个原则.
首先,实施可能违反了"统一界面"(参见Roy的论文第5.1.5节)
通过添加'force_delete',我们在已经很好定义的DELETE方法上添加了一个额外的约束.这种约束只对我们有意义.
您还可能认为它违反了"5.1.2客户端 - 服务器",因为确认对话确实是UI问题,并且并非所有客户端都希望确认删除.
有人建议吗?
HTTP上的Wikipedia条目列出了以下HTTP请求方法:
我有兴趣了解(特别是关于前五种方法):
我很欣赏所有的输入,如果你能分享一些(最好是轻的)阅读,那也很棒!
为什么HttpMethods如GET和DELETE不能包含身体?
public Task<HttpResponseMessage> GetAsync(Uri requestUri);
public Task<HttpResponseMessage> DeleteAsync(string requestUri);
Run Code Online (Sandbox Code Playgroud)
同样在Fiddler中,如果我提供一个身体,背景会变成红色.但它仍然会在身体上执行.

所以作为替代方案,我SendAsync()之所以使用,是因为它接受HttpRequestMessage哪些内容HttpMethod以及内容.
// other codes
Category category = new Category(){ Description = "something" };
string categoryContent = JsonConvert.SerializeObject(category);
string type = "application/json";
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Delete, "-page-")
HttpContent content = new StringContent(categoryContent, Encoding.UTF8, type);
HttpClient client = new HttpClient();
message.Content = content;
await client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead);
// other codes
Run Code Online (Sandbox Code Playgroud)
我错过了别的什么吗?
我有一个场景,我需要调用我的Web API Delete方法,如下所示:
// DELETE: api/products/{id}/headers
[HttpDelete("{id}/headers")]
public void DeleteProductHeaders(int id, [FromBody] string query)
{
}
Run Code Online (Sandbox Code Playgroud)
诀窍是,为了获得查询,我需要通过正文发送它,而DeleteAsync没有像post那样的json参数.有谁知道如何使用c#中的System.Net.Http客户端来做到这一点?
// Delete a product's headers
public void DeleteProductHeaders(int id, string query)
{
using (var client = GetClient())
{
HttpResponseMessage response;
try
{
// HTTP DELETE
response = client.DeleteAsync($"api/products/{id}/headers").Result;
}
catch (Exception ex)
{
throw new Exception("Unable to connect to the server", ex);
}
}
return retVal;
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试向FormRequest我的删除方法添加规则和消息,但请求将返回空白,并且规则每次都失败.
是否可以在删除方法中获取请求数据?
这是我的请求类:
use App\Http\Requests\Request;
class DeleteRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'staff_id' => ['required', 'exists:users,uid'],
'reason' => ['required', 'string'],
];
}
/**
* Get custom messages for validator errors.
*
* @return array …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET MVC 5网站-使用C#客户端代码,我可以使用HttpClient.PutAsJsonAsync(path,myObject)很好地调用Json API(该API也是在Web API中创建的)。
client.BaseAddress = new Uri("http://mydomain");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PutAsJsonAsync("api/something", myObj);
Run Code Online (Sandbox Code Playgroud)
我想对Delete动词做同样的事情。但是client.DeleteAsync,不允许在体内传递对象。(我想在URI中记录删除原因以及要删除的项目的ID)。
有没有办法做到这一点?
asp.net-web-api dotnet-httpclient asp.net-mvc-5 asp.net-web-api2
我正在使用swagger openapi 规范 3.0从我的界面生成 swagger。我有一个接受请求正文的删除方法。但根据RFC7231,DELETE不接受任何请求体。Swagger-request body也说明了这一点。但我的 API 设计为接受 DELETE 操作中的请求正文。在创建 swagger 时是否有任何解决方法,以便 DELETE 操作接受请求正文。目前我从招摇生成中得到的错误是,
Sematic error: DELETE operations cannot have a requestBody
Run Code Online (Sandbox Code Playgroud) http ×6
rest ×4
c# ×2
http-delete ×1
http-get ×1
http-method ×1
laravel ×1
laravel-5 ×1
openapi ×1
payload ×1
php ×1
request ×1
swagger ×1
swagger-3.0 ×1