在Web API上获取POST数据

时间:2017-07-31 13:37:08

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

我有一个在c#中运行的Web API服务器。 httpget方法运行得很好,但我对Web Api来说太新了,无法让帖子发挥作用,而且我所做的搜索有点没用。

这是我在ApiController中的HttpPost

    [HttpPost]
    public bool UploadLogs(UploadLogsIn logs)
    {
        return true;
    }

这是模型

public class UploadLogsIn
{
    public byte[] logData { get; set; }
    public int aLogs { get; set; }
}

在c ++应用程序中,我尝试将数据发布到此方法。我正在使用Curl来发布帖子

    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.56.109:9615/api/WebApiService/UploadLogs");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, R"({"UploadLogsIn": [{"aLogs: 10}]})");
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);
        curl_easy_perform(curl);
    }

    curl_easy_cleanup(curl);

当我调试Web Api时,该方法被命中,但该参数不包含任何数据。

更新 使用wireshark,这是发送的信息

POST /api/WebApiService/UploadLogs HTTP/1.1
Host: 192.168.56.109:9615
Accept: */*
Content-Length: 32
Content-Type: application/x-www-form-urlencoded

Form item: "{"UploadLogsIn": [{"aLogs: 10}]}" = ""

END UPDATE

如果我添加标题

        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Accept: application/json");
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "charsets: utf-8");

然后我的参数为空。

Wireshark转储是

POST /api/WebApiService/UploadLogs HTTP/1.1
Host: 192.168.56.109:9615
Accept: application/json
Content-Type: application/json
charsets: utf-8
Content-Length: 32

Line-based text data: application/json
{"UploadLogsIn": [{"aLogs: 10}]}

我确信有些事我说不对。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

您想要的课程与发送的数据之间存在不匹配。

您想要的课程看起来像这样

public class UploadLogsIn {
    public byte[] logData { get; set; }
    public int aLogs { get; set; }
}

但是发送的数据看起来像这样

{"UploadLogsIn": [{"aLogs": 10}]}

反序列化时看起来像这样

public class UploadLogsIn
{
    public int aLogs { get; set; }
}

public class RootObject
{
    public IList<UploadLogsIn> UploadLogsIn { get; set; }
}

看到区别?

让模型绑定到此操作

[HttpPost]
public bool UploadLogs([FromBody]UploadLogsIn logs) {
    return true;
}

发送的数据必须如下所示

{"aLogs": 10}

答案 1 :(得分:1)

尝试在 UploadLogs 中使用 [FromBody]

java -jar myapp.jar -Dhttp.proxyHost=proxy.mycorp/com -Dhttp.proxyPort=8080

答案 2 :(得分:1)

我还将[FromBody]添加到我的输入数据中。

我查看了swagger建议我在帖子声明中发送数据的内容:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{     "EmailAddress": "string",    "Title": "string",     Message": "string",     "OriginId": 0,     "Name": "string"   }'  http://wfadpqa.sidmar.be/SecureIt.Service/api/contact'