簡體   English   中英

如何接受 JSON 作為其內容類型的無主體 GET 請求?

[英]How to accept a bodyless GET request with JSON as it's content type?

在遷移到 ASP.NET Core 2.1 后,我們意識到我們的 API 的一些消費者正在發送Content-Type header 設置為application/json的 GET 請求。 可悲的是,這些請求過去沒有被拒絕(即使他們應該拒絕),但這仍然是一個突破性的變化。

由於我們的消費者需要自己解決這個問題,這需要一些時間,我們希望暫時接受這些請求,這樣我們就不會等待這個問題。

框架(正確)拒絕請求並顯示以下錯誤消息: "A non-empty request body is required."

動作如下所示:

[Route("api/file/{id:guid}")]
public async Task<IActionResult> Get(Guid id)
{
     // Some simple code here
}

未到達操作內的代碼,因為錯誤在到達操作之前已被拋出(由於請求不正確)。

@Nkosi 的解決方案產生了相同的響應:

[HttpGet("api/file/{id:guid}")]
public async Task<IActionResult> Get([FromRoute]Guid id)
{
     // Some simple code here
}

消費者使用的 (PHP) cURL 是這樣的:

$ch = curl_init(self::API_URL."/file/".$id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "Application: APPKey ".$this->AppKey,
    "Authorization: APIKey ".$this->ApiKey
));

刪除"Content-Type: application/json",行會將請求變為有效請求,因此我們有 99.9% 的把握確定添加此 header 是作惡者。

考慮在管道的早期刪除中間件中的 header。

public void Configure(IApplicationBuilder app) {
    app.Use(async (context, next) => {
        var request = context.Request;
        var method = request.Method;
        IHeaderDictionary headers = request.Headers;
        string key = "Content-Type";
        if (method == "GET" && request.Headers.ContainsKey(key)) {
            headers.Remove(key);
        }

        // Call the next delegate/middleware in the pipeline
        await next();
    });

    //...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM