如何使用 HttpClient Post JSON 将数据发送到 Web API
How to Post JSON data to a Web API using HttpClient
我有以下代码,基本上它接受一个动态对象(在这种情况下是类型文件)并使用 HTTPClient
class 尝试将 POST 转换为 WebAPI controller
,我遇到的问题是控制器总是为我的 [FromBody]
参数上的值获取 NULL
。
代码
var obj = new
{
f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
},
}
var client = new HttpClient(signingHandler)
{
BaseAddress = new Uri(baseURL + path) //In this case v1/document/checkin/12345
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
action = Uri.EscapeUriString(action);
//Obj is passed into this, currently it is of type File
var content = new StringContent(JsonConvert.SerializeObject(obj).ToString(),
Encoding.UTF8, "application/json");
response = client.PostAsync(action, content)).Result;
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
string responseString = responseContent.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<T>(responseString);
}
控制器
[HttpPost]
[Route("v1/document/checkin/{id:int}")]
public void Checkin_V1(int id, [FromBody] File f)
{
//DO STUFF - f has null on all of its properties
}
型号
public class File
{
public string FileName { get; set; }
public string VersionName { get; set; }
public string Description { get; set; }
public string MimeType { get; set; }
public byte[] Bytes { get; set;}
public string File64 { get; set; }
}
模型在 WebAPI
和客户端应用程序上共享。
任何关于失败原因的帮助将不胜感激,现在已经绕了一段时间。
我认为你的这部分代码有问题
var obj = new
{
f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
},
}
因为这将以不同于您真正需要的方式进行序列化。
试试这个
var obj = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
}
您一开始的 obj 是不需要的。那是将 f 嵌套在另一个对象中。
var obj = new
{
f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
},
}
改为
var f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
};
那就序列化f吧。
我有以下代码,基本上它接受一个动态对象(在这种情况下是类型文件)并使用 HTTPClient
class 尝试将 POST 转换为 WebAPI controller
,我遇到的问题是控制器总是为我的 [FromBody]
参数上的值获取 NULL
。
代码
var obj = new
{
f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
},
}
var client = new HttpClient(signingHandler)
{
BaseAddress = new Uri(baseURL + path) //In this case v1/document/checkin/12345
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
action = Uri.EscapeUriString(action);
//Obj is passed into this, currently it is of type File
var content = new StringContent(JsonConvert.SerializeObject(obj).ToString(),
Encoding.UTF8, "application/json");
response = client.PostAsync(action, content)).Result;
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
string responseString = responseContent.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<T>(responseString);
}
控制器
[HttpPost]
[Route("v1/document/checkin/{id:int}")]
public void Checkin_V1(int id, [FromBody] File f)
{
//DO STUFF - f has null on all of its properties
}
型号
public class File
{
public string FileName { get; set; }
public string VersionName { get; set; }
public string Description { get; set; }
public string MimeType { get; set; }
public byte[] Bytes { get; set;}
public string File64 { get; set; }
}
模型在 WebAPI
和客户端应用程序上共享。
任何关于失败原因的帮助将不胜感激,现在已经绕了一段时间。
我认为你的这部分代码有问题
var obj = new
{
f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
},
}
因为这将以不同于您真正需要的方式进行序列化。 试试这个
var obj = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
}
您一开始的 obj 是不需要的。那是将 f 嵌套在另一个对象中。
var obj = new
{
f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
},
}
改为
var f = new File
{
Description = description,
File64 = Convert.ToBase64String(fileContent),
FileName = fileName,
VersionName = versionName,
MimeType = mimeType
};
那就序列化f吧。