相关疑难解决方法(0)

带请求正文的HTTP GET

我正在为我们的应用程序开发一个新的RESTful Web服务.

在某些实体上执行GET时,客户端可以请求实体的内容.如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数.

或者,我希望人们能够在请求正文中指定这些参数. HTTP/1.1似乎没有明确禁止这一点.这将允许他们指定更多信息,可以更容易指定复杂的XML请求.

我的问题:

  • 这完全是一个好主意吗?
  • HTTP客户端在GET请求中使用请求主体会有问题吗?

http://tools.ietf.org/html/rfc2616

rest http http-get

1896
推荐指数
19
解决办法
98万
查看次数

实体主体是否允许HTTP DELETE请求?

发出HTTP DELETE请求时,请求URI应完全标识要删除的资源.但是,是否允许添加额外的元数据作为请求的实体主体的一部分?

rest http

651
推荐指数
13
解决办法
36万
查看次数

REST,HTTP DELETE和参数

是否有任何关于为HTTP DELETE请求提供参数的非RESTful?


我的情况是我正在建模"您确定要删除它吗?" 场景.在某些情况下,资源的状态表明请求的删除可能无效.你可以想象一些自己需要确认删除的场景

我们采用的解决方案是将参数传递给删除请求以指示可以继续删除("?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问题,并且并非所有客户端都希望确认删除.

有人建议吗?

rest http

126
推荐指数
4
解决办法
11万
查看次数

HTTP请求方法的有效负载

HTTP上Wikipedia条目列出了以下HTTP请求方法:

  • HEAD:要求响应与对应于GET请求的响应相同,但没有响应主体.
  • GET:请求指定资源的表示.
  • POST:将要处理的数据(例如,从HTML表单)提交到标识的资源.数据包含在请求正文中.
  • PUT:上传指定资源的表示.
  • DELETE:删除指定的资源.
  • TRACE:回显收到的请求,以便客户端可以查看中间服务器所做的更改或添加(如果有).
  • 选项:返回服务器支持指定URL的HTTP方法.这可以通过请求'*'而不是特定资源来检查Web服务器的功能.
  • CONNECT:将请求连接转换为透明的TCP/IP隧道,通常是为了通过未加密的HTTP代理实现SSL加密通信(HTTPS).
  • 补丁:用于对资源应用部分修改.

我有兴趣了解(特别是关于前五种方法):

  • 哪些方法能够(应该?)接收有效载荷
    • 可以接收有效载荷的方法,它们如何接收?
      • 通过URL中的查询字符串?
      • 通过URL编码的身体?
      • 通过raw/chunked body?
      • 通过上述([全部/部分])的组合?

我很欣赏所有的输入,如果你能分享一些(最好是轻的)阅读,那也很棒!

rest http request payload http-method

68
推荐指数
2
解决办法
9万
查看次数

GET/DELETE背后的原因不能在webapi中有正文

为什么HttpMethods如GETDELETE不能包含身体

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)

我错过了别的什么吗?

c# asp.net-web-api

11
推荐指数
1
解决办法
6213
查看次数

使用System.Net.Http调用Delete Web API方法时传递正文内容

我有一个场景,我需要调用我的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)

c# http asp.net-web-api system.net.httpwebrequest

7
推荐指数
2
解决办法
1万
查看次数

带有请求体的Laravel DELETE方法

我一直在尝试向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)

php http http-delete laravel laravel-5

4
推荐指数
1
解决办法
2817
查看次数

client.DeleteAsync-在主体中包含对象

我有一个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

3
推荐指数
1
解决办法
4883
查看次数

Swagger openApi Spec 3.0 - 删除操作

我正在使用swagger openapi 规范 3.0从我的界面生成 swagger。我有一个接受请求正文的删除方法。但根据RFC7231DELETE不接受任何请求体。Swagger-request body也说明了这一点。但我的 API 设计为接受 DELETE 操作中的请求正文。在创建 swagger 时是否有任何解决方法,以便 DELETE 操作接受请求正文。目前我从招摇生成中得到的错误是,

Sematic error: DELETE operations cannot have a requestBody
Run Code Online (Sandbox Code Playgroud)

swagger openapi swagger-3.0

3
推荐指数
1
解决办法
2万
查看次数