对服务的PATCH请求在我的C#应用​​程序中不起作用,但在Fiddler中起作用

时间:2018-07-25 22:05:23

标签: c# rest api

我目前正在开发可与外部服务一起使用的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;
    }

如果从中可以得到任何教训,那就应该对复制和粘贴的代码进行两次和三次检查。再次感谢!

1 个答案:

答案 0 :(得分:2)

您的POSTPUTPATCH请求缺少正文。处理请求的服务应如何知道您要更改的资源?您需要在Content上设置HttpRequestMessage属性。

有关示例,请参见this answer