2017-07-31 67 views
2

我有一个运行在c#中的Web API服务器。 httpget方法可以完美工作,但对于Web Api来说,我太过于陌生,无法让帖子起作用,而且我所做的搜索功能有些徒劳无功。在Web API上获取POST数据

这是我HttpPost在ApiController

[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时,该方法被击中,但该参数不包含任何数据。

UPDATE 使用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}]}" = "" 

结束时更新

如果我添加页眉

 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"); 

那么我的参数为null 。

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}]} 

我敢肯定有一些愚蠢的,我不这样做的权利。任何帮助将不胜感激

+0

发送的数据没有很好形成JSON数据的数据。查看你如何构建JSON对象。这些类与发送的json不匹配 – Nkosi

+0

我已将字符串更改为'curl_easy_setopt(curl,CURLOPT_POSTFIELDS,R“({”UploadLogsIn“:[{”aLogs“:10}]})”); JSON中还存在什么错误?结果在这个阶段保持不变 – Jaques

回答

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

我与空有关的实际问题是因为我在字节[]中使用了无效信息。一切都在工作。 – Jaques

1

尝试使用[FromBody]UploadLogs

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

对不起,我没有提到这一点。我已经添加了,并且在[HttpPost]' – Jaques

+0

下面加入了[ResponseType(typeof(UploadLogsIn)]]',但是没有效果?还是同样的问题?尝试使用提琴手嗅探请求正文中发送的内容 – Vladimir

+0

我正在使用Wireshark。我将编辑我的问题以添加以及 – Jaques

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'