我正在尝试将数据发送到我的后端,但是当涉及到后端时会捕获一个expception,从而返回错误消息。 我假设这是因为客户端的数据格式与我的预期不同。
我说明我的后端接收json字符串(我有其他函数,以后将jsong字符串转换为对象)。
我做错了什么?我知道我可以在我的后端从客户端为我的数据创建建模类,但是我需要在没有它们的情况下工作它并且它应该工作,因为数据都是来自我的客户端的字符串 来自客户。
客户
//to backend
callServer() {
var data = JSON.stringify(test);
//dispaly JSON like {"GradeA" : "23", "GradeB" : "45", "GradeC" : "22"}
console.log(data);
const headers = new HttpHeaders().set('Content-Type', 'application/json');
this.appService.http.post('http://localhost:2717/api/testAPi/test', data, {headers: headers})
.subscribe(data => {console.log(data), (err) => console.error("Failed! " + err);
})
}
后端
public class testAPiController : ApiController
{
private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public string test([FromBody] string body)
{
try
{
Log.Info(string.Format("data {0}", body));
//convert to json object
return json_object;
}
catch (Exception ex)
{
Log.Error(ex.Message);
return "error";
}
}
}
配置
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
// Web API configuration and services
log4net.Config.XmlConfigurator.Configure();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "GET", id = RouteParameter.Optional }
);
}
}
Updated1
我没有收到任何错误消息,但将我的身体返回为空
Updated2
this.appService.http.post('http://localhost:2717/api/testAPi/test', "{\"GradeA\" : \"23\", \"GradeB\" : \"45\", \"GradeC\" : \"22\"}", {headers: headers})
当Postman使用它时,还没有使用不同的身体格式
答案 0 :(得分:1)
我99%确定这是因为你定义的是你发送JSON(对象) - 你的标题显示给WebAPI:
headers = new HttpHeaders().set('Content-Type', 'application/json');
这个对象非常复杂。 在Controller中,你期待简单的字符串。
你应该:
通过在方法原型中定义模型,将JSON反序列化作业移动到Controller:
public string test([FromBody] YourClassResemblingJson body)
{
...
}
请在Post json data in body to web api
查看有关此问题的更多详细信息或者只是将您的JSON发送为格式正确的字符串。所以JSON最初看起来像这样:
{"body": "sampleBody"}
应如下所示:
"{\"body\": \"sampleBody\"}"
您的代码如下所示:
callServer() {
var data = JSON.stringify(test);
data = "\"" + data.replace("\"", "\\\"") + "\"";
//display JSON like "{\"GradeA\" : \"23\", \"GradeB\" : \"45\", \"GradeC\" : \"22\"}"
console.log(data);
const headers = new HttpHeaders().set('Content-Type', 'application/json');
this.appService.http.post('http://localhost:2717/api/testAPi/test', data, {headers: headers})
.subscribe(data => {console.log(data), (err) => console.error("Failed! " + err);
})
}
在第一种方法中,您将使用来自JSON的数据填充body
对象,而在第二种方法中,您的string
变量中的body
代码正确。
很抱歉这么多编辑,但我不确定你的问题究竟是什么,所以花了一些时间来深入研究WebAPI规范。
答案 1 :(得分:0)
首先,您的API方法是GET
方法,因为这是默认设置,但是来自客户端您正在进行POST
调用。除此之外,传递的数据不会在任何地方使用
public string test([FromBody] string body)
{