从客户端

时间:2017-11-14 20:49:54

标签: c# asp.net json

我正在尝试将数据发送到我的后端,但是当涉及到后端时会捕获一个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使用它时,

还没有使用不同的身体格式

2 个答案:

答案 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)
{