【问题标题】:Web API post parameterWeb API 发布参数
【发布时间】:2015-04-22 09:05:29
【问题描述】:

我目前遇到了 webapi 调用的问题。我想用我的 ApiController 下载并打开一个日志文件。 我使用 javascript 函数将文件名发布到我的控制器。

这是一个发布参数的辅助函数(来自dystroy的答案): How to replace window.open(...) with a POST

现在,当我在控制器中使用简单字符串作为参数时,我无法获取参数,它始终为空。

public HttpResponseMessage PostDownloadLogFile([FromBody]string psFileName)
{
    //psFileName is always null

但是,如果我使用HttpReqeustMessage 作为参数并从我的请求中读取表单数据,则没有问题并且可以正常工作。

public HttpResponseMessage PostDownloadLogFile(HttpRequestMessage poRequest)
{
    var loFormData = poRequest.Content.ReadAsFormDataAsync().Result;
    string psFileName = loFormData["psFileName"]; //psFileName is set correct

有没有办法在我的控制器中用一个简单的参数来获取参数?

更新

这是我的 javascript 辅助函数:

var loOpenWindow = function (psMethode, psUrl, poData, psTarget) {
    var loForm = document.createElement("form");
    loForm.action = psUrl;
    loForm.method = psMethode;
    loForm.target = psTarget || "_self";
    if (poData) {
        for (var lsKey in poData) {
            var loInput = document.createElement("textarea");
            loInput.name = lsKey;
            loInput.value = typeof poData[lsKey] === "object" ? JSON.stringify(poData[lsKey]) : poData[lsKey];
            loForm.appendChild(loInput);
        }
    }
    loForm.style.display = "none";
    document.body.appendChild(loForm);
    loForm.submit();
};

叫它:

helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, { "psFilename": $scope.data.showLogEntry.FullName });

客户端代码应该没有问题,因为带有HttpReqeustMessage 的控制器方法可以正常工作。

这是浏览器请求:

【问题讨论】:

  • 您发送到控制器方法的数据是什么样的?
  • 这是来自这篇文章的 javascript 帮助功能:stackoverflow.com/questions/17793183/…
  • 辅助函数有四个参数:verb、url、data、target。您将什么传递给 data 变量(以及所有其他变量)?
  • helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, { "psFilename": $scope.data.showLogEntry.FullName });
  • 你能把浏览器请求粘贴到这里吗?带有 HTTP 标头和正文。

标签: javascript c# asp.net-web-api


【解决方案1】:

问题可能在于您的客户端代码发送数据。

[FromBody]参数必须编码为=value

那么,这不起作用:

// Value will be null.
$.post('api/values', value);

// Value will be null.
$.post('api/values', { key: value });

但这项工作:

$.post('api/values', "=" + value);

尝试更改您的客户端代码以在正文中仅发送=/path/to/your/file

参考:http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

【讨论】:

  • 我试了一下,但不幸的是该值仍然为空。我试试这个: helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, "=" + $scope.data.showLogEntry.FullName);还有这个:helper.openWindow("POST", apiRoutes.URLS.ApiPostDownloadLogFile, { '': $scope.data.showLogEntry.FullName });
【解决方案2】:

好的,我找到了解决方案。 如果我使用 class 作为参数和具有给定名称的属性,它似乎可以工作。

public class Param
{
    public string psFileName { get; set; }
}

public HttpResponseMessage PostDownloadLogFile(Param poParam)
{
    string psFileName = poParam.psFileName; //psFileName is set correct

这不是一个真正简单的参数,但我可以接受这个解决方案。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多