【问题标题】:not getting right data in my backend from client没有在我的后端从客户端获取正确的数据
【发布时间】:2017-11-14 20:49:53
【问题描述】:

我正在尝试将数据发送到我的后端,但是当涉及到后端时,它会捕获一个异常,从而返回错误消息。 我假设这是因为来自客户端的数据格式与我预期的有所不同。

我希望我的后端接收 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 }
            );

        }
    }

更新1

我没有收到任何错误消息,但将我的正文返回为 null

更新2

 this.appService.http.post('http://localhost:2717/api/testAPi/test', "{\"GradeA\" : \"23\", \"GradeB\" : \"45\", \"GradeC\" : \"22\"}", {headers: headers})

当 Postman 使用它时,仍然不能使用不同格式的 body

【问题讨论】:

  • 您希望从控制器中得到什么?因为现在你只会得到字符串:“ok”和“error”。 EDIT 自从发表此评论后,OP 已经编辑了他们的代码。
  • 我希望在最后得到 json_object
  • 异常的文本是什么?如果调试方法,body的值是多少?
  • 正文为空,异常只返回“错误”
  • 您应该摆脱 catch 块并查看实际错误。

标签: c# asp.net json


【解决方案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);
     })
}

在第一种方法中,body 对象将填充来自 JSON 的数据,在第二种方法中,body 变量中将有正确的string

很抱歉编辑了这么多,但我不确定您的问题到底是什么,所以我花了一些时间来深入研究 WebAPI 规范。

【讨论】:

  • 这实际上给我敲响了警钟,但我收到 Unsported media type 415 错误
  • 你是在我更改之前还是之后得到它?
  • 对不起,YourClassResemblingJson 是什么?
  • 我没有发送 JSON 对象。
  • @ZlatkoLoa 请看看我的编辑。当然,您发送的是 JSON 对象,这正是您的 JSON 字符串。
【解决方案2】:

首先,您的 API 方法是 GET 方法,因为这是默认方法,但您正在从客户端进行 POST 调用。除此之外,传递的数据不会在任何地方使用

public string test([FromBody] string body)
{

【讨论】:

  • 确认设置为 GET
  • @ZlatkoLoa,然后拨打get 并删除FromBody。还要具体说明你得到的错误是什么
  • 您确定可以在 GET 请求中使用[FromBody] 吗?我宁愿认为[FromBody] 只会使用 POST 方法,因为您不能在 GET 请求中发送正文...
  • 没有Frombody,我得到服务器错误代码404。这是我的研究。没有这个,我根本无法让我的客户端连接到我的后端。
  • @Rahul 我肯定在 .NET Core WebAPI 中 [FromBody] 属性会发出请求 POST(我检查过),并且对于旧的 WebAPI 有 99% 的把握。所以请检查你的答案。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多