我目前正在开发可与外部服务一起使用的REST-ful C#应用程序。我已经获得了基本的“ GET”,“ POST”,“ PUT”和“ DELETE”请求才能工作,但是,每当我尝试将PATCH请求发送到同一服务时,它就无法工作。我收到200条消息(表示成功),但对试图尝试执行PATCH请求的主题进行的GET显示未发生更改。
此外,每当我使用Fiddler使用相同的URL和内容字符串来形成PATCH请求时,它都能按预期工作。
我正在尝试确保就我发送HTTP请求而言,这不是我做错的事情。
我与上述所有其他REST功能进行交互的呼叫如下:
public async Task<T> GetResultFromService<T>(string requesttype, string url, string request = "")
{
HttpRequestMessage message;
switch (requesttype)
{
case "Post":
message = PostRequest(url, client, request);
break;
case "Put":
message = PutRequest(url, client, request);
break;
case "Patch":
message = PatchRequest(url, client, request);
break;
case "Delete":
message = DeleteRequest(url, client);
break;
default:
message = GetRequest(url, client);
break;
}
var response = await client.SendAsync(message);
var responseString = await response.Content.ReadAsStringAsync();
return IModel.FromJson<T>(responseString);
}
我形成PATCH请求的功能:
public HttpRequestMessage PatchRequest(string url, HttpClient client, string content = "")
{
var request = new HttpRequestMessage(new HttpMethod("PATCH"), url);
return request;
}
添加GET请求进行比较:
public HttpRequestMessage GetRequest(string url, HttpClient client)
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
return request;
}
还有我的Httpclient代码(如果完全相关...):
var proxy = new WebProxy
{
Address = ServerEnv.ProxyUri
};
var httpHandler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
client = new HttpClient(httpHandler, true);
非常感谢您能指出我的方向。
一吨!
edit:由于答辩人的答复,我意识到自己的错误。基本上,我不小心在PATCH上遗漏了身体,但是在我的POST和PUT上却忽略了这个细节。 POST代码以获取详细信息:
public HttpRequestMessage PostRequest(string url, HttpClient client, string content)
{
var request = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = new StringContent(content,
Encoding.UTF8,
"application/json")
};
return request;
}
和修改后的PATCH:
public HttpRequestMessage PatchRequest(string url, HttpClient client, string content = "")
{
var request = new HttpRequestMessage(new HttpMethod("PATCH"), url)
{
Content = new StringContent(content,
Encoding.UTF8,
"application/json")
};
return request;
}
如果从中可以得到任何教训,那就应该对复制和粘贴的代码进行两次和三次检查。再次感谢!
答案 0 :(得分:2)
您的POST
,PUT
和PATCH
请求缺少正文。处理请求的服务应如何知道您要更改的资源?您需要在Content
上设置HttpRequestMessage
属性。
有关示例,请参见this answer。