2017-07-31 64 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'