c# - 将对象数据从控制台应用程序发布到 Web API
问题描述
我正在.Net Core 中创建一个控制台应用程序,该应用程序从 Web API 获取数据,更新该数据并执行 Put 以更新 Web API 数据。我遇到了一个问题,当我将数据发送到 HttpContent 时,我在 HttpRequestBuilder 中丢失了我的数据,并且 Web API 没有得到更新,但我得到了 200 返回。有什么想法我可能做错了吗?
控制器:
public static async Task<HttpResponseMessage> UpdateTransaction(Transaction transaction)
{
var requestUri = $"{baseUri}transactions/{transaction.ID}";
return await HttpRequestFactory.Put(requestUri, transaction);
}
json内容:
public JsonContent(object value, string mediaType)
:base(JsonConvert.SerializeObject(value), Encoding.UTF8, mediaType)
{
}
HttpRequestFactory:
public static async Task<HttpResponseMessage> Put(string requestUri, object value)
{
var builder = new HttpRequestBuilder()
.AddMethod(HttpMethod.Put)
.AddRequestUri(requestUri)
.AddContent(new JsonContent(value, "application/json"));
return await builder.SendAsync();
}
HttpRequestBuilder:
public HttpRequestBuilder AddContent(HttpContent content)
{
this.content = content;
return this;
}
public async Task<HttpResponseMessage> SendAsync()
{
// Check required arguments
EnsureArguments();
// Setup request
var request = new HttpRequestMessage
{
Method = this.method,
RequestUri = new Uri(this.requestUri)
};
if (this.content != null)
request.Content = this.content;
request.Headers.Accept.Clear();
if (!string.IsNullOrEmpty(this.acceptHeader))
request.Headers.Accept.Add(
new MediaTypeWithQualityHeaderValue(this.acceptHeader));
// Setup client
var client = new HttpClient();
client.Timeout = this.timeout;
var response = await client.SendAsync(request);
return response;
}
解决方案
我不认为JsonContent
班级正在做正确的事情。我们缺少完整的类定义,所以我只能猜测:
当您在Put
方法中调用它时,它会返回一个对象,.AddContent
但这可能不会被序列化为内容字符串。
更改您的Put
方法以直接调用该JsonConvert
方法。
HttpRequestFactory:
public static async Task<HttpResponseMessage> Put(string requestUri, object value)
{
var builder = new HttpRequestBuilder()
.AddMethod(HttpMethod.Put)
.AddRequestUri(requestUri)
.AddContent(JsonConvert.SerializeObject(value, Encoding.UTF8, "application/json"));
return await builder.SendAsync();
}
如果您确实想使用您的JsonContent
类,那么使用静态方法而不是类层次结构可能会更好?
推荐阅读
- c# - WPF - UI 未从命令更新
- python - 如何确定地抑制 Python 中的 DeprecationWarning?
- google-apps-script - 无法使用 Google Apps 脚本登录网站并收到错误 422
- javascript - 在它之前创建带有一些文本的动态链接
- java - 每天在 Oreo 上运行一次警报服务
- jquery - 如何使用ajax验证并提交验证成功的表单?
- php - 数组项值的总和
- haskell - 是否可以在 Haskell 中引用特定的实例函数?
- sas - SAS宏错误找到的位置参数比定义的多
- python - 如何从训练、测试和验证文件夹中的多个文件夹中拆分和复制文件