【问题标题】:How to make an HTTP Patch request from C# with a parameter [FromBody]如何使用参数 [FromBody] 从 C# 发出 HTTP Patch 请求
【发布时间】:2020-11-29 19:38:42
【问题描述】:

我正在创建一个 Web API 服务,但在调用 HTTP 补丁请求时遇到了一些问题。虽然我知道如何创建它们。 如果您能帮助我,我将不胜感激,这是我的代码:

HTTP 补丁代码:

[HttpPatch("{username}")]
        public async Task<ActionResult> Patch(string username, [FromBody] JsonPatchDocument<User> patchDocument)
        { 
            //If no info has been passed, this API call will return badrequest
            if (patchDocument == null)
                return BadRequest();

            var theUser = await connection.GetAUser(username);
            var originalUser = await connection.GetAUser(username);

            if (theUser == null)
                return NotFound();

            //Changes specified in the patchdocument are applied to the user
            patchDocument.ApplyTo(theUser, ModelState);
            //check if the patching has been successful or not
            bool isValid = TryValidateModel(theUser);

            if (!isValid)
                return BadRequest(ModelState);
            else
            {
                bool check = await connection.UpdateUser(originalUser, theUser);
                if (check != true)
                    return BadRequest();
                else
                    return Ok();
            }

        }

与 SQL 数据库的关联(从前面的代码调用的方法):

        public async Task<bool> UpdateUser(User originalUser, User patchedUser)
        {
            SqlCommand sqlCommand = new SqlCommand();
            try
            {
                if (originalUser.password != patchedUser.password)
                {
                    //string command = SQL COMMAND
                    SqlParameter param1 = new SqlParameter();
                    param1.ParameterName = "@password";
                    param1.Value = patchedUser.password;
                    SqlParameter param2 = new SqlParameter();
                    param2.ParameterName = "@username";
                    param2.Value = patchedUser.username;

                    sqlCommand.CommandText = command;
                    sqlCommand.Parameters.Add(param1);
                    sqlCommand.Parameters.Add(param2);

                    connection = new DataBaseConnectionService(configuration, sqlCommand);
                    await connection.GetData();
                }
                else
                    return true;
                return true;
            }
            catch (Exception error)
            {
                return false;
            }
        }

我已经在 PostMan 上对其进行了测试,它运行良好。问题是我知道如何在 PostMan 上传递 JsonPatchDocument FromBody,但我不知道如何使用 C#(我需要这个从 APP 进行调用)。 我试图寻找有关此问题的答案,但我只找到有关如何创建 API 的信息,而不是有关如何从 C# 调用它的信息。 就是这样,如果您需要更多信息,我会在看到您的请求后立即提供,非常感谢大家的时间,希望大家有美好的一天。

编辑: 在深入研究这个问题之后,我找到了一种可行的方法,但是它返回了一个 405 状态代码(“方法不允许”): 这是我在 C# 应用程序中使用的代码

        public async Task<string> PatchUser(UserModel User_Raw)
        {
            if (client == null)
                InitializeClient();

            try
            {
                //converts the UserModel to JsonPatchDocument<UserModel>
                JsonPatchDocument<UserModel> body = new JsonPatchDocument<UserModel>();
                body.Replace(e = e, User_Raw);

                //Converts the JsonPatchDocument<UserModel> to Json
                var serializedJsonDocument = JsonConvert.SerializeObject(body);
                var stringUser = new StringContent(serializedJsonDocument, UnicodeEncoding.UTF8, "application/json");

                //
                var request = new HttpRequestMessage(new HttpMethod("PATCH"), "Here goes the URL");
                request.Content = stringUser;

                //response stores the Post result to later ensure that it has been successful
                var response = await client.SendAsync(request);
                response.EnsureSuccessStatusCode();

                string HttpResponse = await response.Content.ReadAsStringAsync();
                return HttpResponse;
            }
            catch (HttpRequestException error)
            {
                return null;
            }
            catch (Exception error)
            {
                jsonResult = null;
                return jsonResult;
            }
        }

【问题讨论】:

    标签: c# api rest httprequest patch


    【解决方案1】:

    您是在问如何从 C# 应用程序发出 PATCH 请求吗?既然如此,你为什么要显示所有不相关的服务器代码?

    要发出 PATCH 请求,请实例化 HttpClient,然后执行以下操作:

        JsonPatchDocument<User> body = <...>;
        HttpResponseMessage response = await client.PatchAsync(requestUri, body);
    

    如果您被 .NET Framework 卡住,您将没有 PatchAsync,在这种情况下您必须执行以下操作:

        var request = new HttpRequestMessage(new HttpMethod("PATCH"), requestUri) {
            Content = body
        };
        var response = await client.SendAsync(request);
    

    【讨论】:

    • 我展示它是因为我不知道它是否相关。我不能使用PatchAsync,不知道为什么,但是我使用net.http.httpclient时没有出现
    • @JaimeSantos 我扩展了答案。这有帮助吗?
    • 我更新了尝试这个的问题,总结一下,它给了我一个 405 错误。我无法将 JsonPatchDocument 分配给 HttpRequestMessage 的内容,因此我做了几件事将其转换为 StringContent。我可能错误地进行了转换,如果您能检查一下,我将不胜感激。到目前为止,感谢您的帮助,我觉得我几乎得到了它(:
    • @JaimeSantos 我认为这与主体没有任何关系(要调试,请使用不带任何主体参数的方法)。 405 表示该方法不被允许。如果您在 IIS 上托管,您可能需要编辑 web.config:stackoverflow.com/questions/19162825/…
    • 没关系,我用错了网址,我又试了一次,效果很好,非常感谢您的帮助((((:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2014-02-04
    • 2013-01-05
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多