我有一个在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}]}
我确信有些事我说不对。任何帮助将不胜感激
答案 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'