"Message body is malformed. Unable to map into expected format" 更新控制器服务时响应 400 错误请求
"Message body is malformed. Unable to map into expected format" response with 400 Bad request when update controller service
尝试在 nifi 实例上更新控制器服务时遇到问题。我尝试向 nifi 实例发出 "put" 请求并禁用控制器服务。
这是我的逻辑:
获取特定的控制器服务 (controller-services/{id})
解析到 ControllerServiceEntity 对象的响应消息
更新服务状态 --> currentService.Component.State = "DISABLED"; (实体的所有部分与我第一次更新状态属性相同)
序列化修改后的服务实例
请求 nifi-api 更新服务 (controller-services/{id})
我收到了带有 "Message body is malformed. Unable to map into expected format." 消息的 Badrequest 响应。
这是我的放置请求方法:
public async Task<T> Put<T>(Uri url,T data) where T:IBaseEntitty
{
T resultEntity = default(T);
using (var client = new HttpClient())
{
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var requestContent = new StringContent(JsonConvert.SerializeObject(data,jsonSerializerSettings), Encoding.UTF8, "application/json");
var response = client.PutAsync(url,requestContent);
var content = response.Result.Content;
using (var reader = new StreamReader(await content.ReadAsStreamAsync()))
{
var result = await reader.ReadToEndAsync();
if (response.Result.StatusCode == HttpStatusCode.OK)
{
var template = Newtonsoft.Json.JsonConvert.DeserializeObject(result, typeof(T));
if (template != null)
{
resultEntity = (T)template;
}
}
}
}
return resultEntity;
}
有什么想法吗?
响应正文应包含一条消息,说明请求失败的原因。此外,<NIFI_HOME>/logs/nifi-user.log
和 <NIFI_HOME>/logs/nifi-app.log
可能包含更多详细信息。
此外,我建议在您的网络浏览器中打开开发者工具,以查看这些请求的运行情况。 UI 专门使用 REST API 来实现其所有功能。
据我所知,请求消息应该很短;我的坏处是把整个实体送回去。我在浏览器上打开开发人员工具并检查了 nifi 实例自己的请求并与我的进行比较:比我注意到请求只包含将要更新的属性,而不是整个实体。
请求正文必须仅包含状态和修订信息。这是nifi实例在禁用控制器服务时发送的请求体:
{"revision":{"clientId":"644bf345-015d-1000-e82d-047f6a9f9432","version":15},"component":{"id":"015b1030-a099-13d3-812c-77772afcaeb0","state":"DISABLED"}}
我根据这些信息更改了我的代码。这是我设置禁用控制服务的示例代码:
var controllerService = new ControllerServiceEntity();
controllerService.Id = existingService.Id;
controllerService.Revision = existingService.Revision;
var component = new ControllerServiceDTO();
component.Id = existingService.Component.Id;
component.State = "DISABLED";
controllerService.Component = component;
在我发送新的控制服务实例而不是现有的实例后,它按我预期的那样工作。
尝试在 nifi 实例上更新控制器服务时遇到问题。我尝试向 nifi 实例发出 "put" 请求并禁用控制器服务。
这是我的逻辑:
获取特定的控制器服务 (controller-services/{id})
解析到 ControllerServiceEntity 对象的响应消息
更新服务状态 --> currentService.Component.State = "DISABLED"; (实体的所有部分与我第一次更新状态属性相同)
序列化修改后的服务实例
请求 nifi-api 更新服务 (controller-services/{id})
我收到了带有 "Message body is malformed. Unable to map into expected format." 消息的 Badrequest 响应。
这是我的放置请求方法:
public async Task<T> Put<T>(Uri url,T data) where T:IBaseEntitty
{
T resultEntity = default(T);
using (var client = new HttpClient())
{
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var requestContent = new StringContent(JsonConvert.SerializeObject(data,jsonSerializerSettings), Encoding.UTF8, "application/json");
var response = client.PutAsync(url,requestContent);
var content = response.Result.Content;
using (var reader = new StreamReader(await content.ReadAsStreamAsync()))
{
var result = await reader.ReadToEndAsync();
if (response.Result.StatusCode == HttpStatusCode.OK)
{
var template = Newtonsoft.Json.JsonConvert.DeserializeObject(result, typeof(T));
if (template != null)
{
resultEntity = (T)template;
}
}
}
}
return resultEntity;
}
有什么想法吗?
响应正文应包含一条消息,说明请求失败的原因。此外,<NIFI_HOME>/logs/nifi-user.log
和 <NIFI_HOME>/logs/nifi-app.log
可能包含更多详细信息。
此外,我建议在您的网络浏览器中打开开发者工具,以查看这些请求的运行情况。 UI 专门使用 REST API 来实现其所有功能。
据我所知,请求消息应该很短;我的坏处是把整个实体送回去。我在浏览器上打开开发人员工具并检查了 nifi 实例自己的请求并与我的进行比较:比我注意到请求只包含将要更新的属性,而不是整个实体。
请求正文必须仅包含状态和修订信息。这是nifi实例在禁用控制器服务时发送的请求体:
{"revision":{"clientId":"644bf345-015d-1000-e82d-047f6a9f9432","version":15},"component":{"id":"015b1030-a099-13d3-812c-77772afcaeb0","state":"DISABLED"}}
我根据这些信息更改了我的代码。这是我设置禁用控制服务的示例代码:
var controllerService = new ControllerServiceEntity();
controllerService.Id = existingService.Id;
controllerService.Revision = existingService.Revision;
var component = new ControllerServiceDTO();
component.Id = existingService.Component.Id;
component.State = "DISABLED";
controllerService.Component = component;
在我发送新的控制服务实例而不是现有的实例后,它按我预期的那样工作。