【问题标题】:Web API read JSON/ XML parametersWeb API 读取 JSON/XML 参数
【发布时间】:2016-03-14 13:27:04
【问题描述】:

我有 Web API,我想读取在“请求正文”中传递给它的所有参数。我正在使用 Fiddler 发布数据,如下所示,但我无法在控制器中读取这些参数:

API 控制器中的代码如下所示

public async Task<string> Post()
{
    return await Request.Content.ReadAsStringAsync();
}

在响应中一无所获:

不确定这里出了什么问题,但无法阅读发布的内容。

【问题讨论】:

  • Duplicate Question(添加.Result
  • 这对我没有帮助@Igor
  • 当你说not able to read parameters in controller的时候,你有没有下断点并尝试调试动作?动作是否被击中?

标签: c# asp.net-mvc asp.net-web-api2


【解决方案1】:

我用 Fiddler 测试了以下内容

POST http://localhost:35979/api/tests HTTP/1.1
User-Agent: Fiddler
Host: localhost:35979
Content-Type: application/json; charset=utf-8
Content-Length: 36

{"FirstName":"Foo","LastName":"Bar"}

使用此控制器。 (你没有提供Minimal, Complete, and Verifiable example,所以我自己制作)

[RoutePrefix("api/student")]
public class StudentController : ApiController {
    // POST api/student
    [HttpPost]
    [Route("")]
    public async Task<string> Post() {
        var content = await Request.Content.ReadAsStringAsync();
        return content;
    }
}

content 上有一个断点,我能够调试发布的原始值是

"{\"FirstName\":\"Foo\",\"LastName\":\"Bar\"}" 

在 Visual Studio 中的 Text Visualizer 中看起来像这样

{"FirstName":"Foo","LastName":"Bar"}

回到 Fiddler,我收到以下原始响应(为简洁起见,删除了其他标头)

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 46

"{\"FirstName\":\"Foo\",\"LastName\":\"Bar\"}"

您会注意到发布的内容确实在响应中返回。

但是它作为原始转义字符串返回。如果您转到 Fiddler 中响应的 JSON 选项卡,它将是空的,就像您在标题中显示的那样。但是您会注意到底部有一条消息说明

位置 0 处的文本无效

这在您的标题中不可见。我的猜测是 Fiddler 无法将响应的内容解析为 Json。

现在,如果您希望框架使用发送到控制器的参数,您可以尝试以下方法之一。

创建一个模型/有效负载来存储您的参数,以便您可以使用对象而不是原始值。

public class Student {
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

编辑您的控制器以期望该模型,或者正如您将在第二个示例操作中看到的那样,它可以从主体或 URI 中提取参数

[RoutePrefix("api/student")]
public class StudentController : ApiController {
    // POST api/student
    [HttpPost]
    [Route("")]
    public async Task<Student> Post(Student content) {
        var FirstName = content.FirstName;
        var LastName = content.LastName;
        return content;
    }

    // POST api/student/bodyexample
    [HttpPost]
    [Route("bodyexample")]
    public async Task<Student> Post2([FromBody]FirstName, [FromBody] LastName) {
        var content = new Student { FirstName = FirstName, LastName = LastName };
        return content;
    }

}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多