如何使用参数 [FromBody] 从 C# 发出 HTTP 补丁请求
How to make an HTTP Patch request from C# with a parameter [FromBody]
我正在创建 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# 调用它的信息。
就是这样,如果您需要更多信息,我会在看到您的请求后立即提供,非常感谢您的宝贵时间,祝大家有个美好的一天。
编辑:
在深入研究此事之后,我找到了一种可行的方法,但是 returns 我得到了 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# 应用程序发出 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);
我正在创建 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# 调用它的信息。 就是这样,如果您需要更多信息,我会在看到您的请求后立即提供,非常感谢您的宝贵时间,祝大家有个美好的一天。
编辑: 在深入研究此事之后,我找到了一种可行的方法,但是 returns 我得到了 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# 应用程序发出 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);