当响应只有位置标头,没有正文时,Restsharp返回null



我正在使用RestSharp使用CapsuleCRM API。

当您POST创建实体时,API不会在响应的主体中返回任何内容,只会向新创建的行返回一个位置头。

像这样:

http://developer.capsulecrm.com/v1/writing/

HTTP/1.1 201 Created
Location: https://sample.capsulecrm.com/api/party/1000

因此,如果RestSharp要能够返回一个对象,它必须遵循该位置标头url,并从那里检索新对象,但这似乎没有发生。

这个问题类似于另一个问题,但不是重复的:当响应标头具有位置字段时,RestSharp返回零值

更新:我发布了一个我想出的破解解决方案作为答案,但RestSharp真的没有办法默认处理这个问题吗?

我能够通过制作的调整版本来实现这一点

public T Execute<T>(RestRequest request) where T : new()

方法,但确实感觉应该有一个更好的解决方案。

源代码位于:https://github.com/bjovas/CapsuleDotNet/blob/master/src/CapsuleDotNetWrapper/CapsuleApi.cs

    public T CreateExecute<T>(RestRequest request) where T : new()
    {
        var client = new RestClient();
        client.BaseUrl = BaseUrl;
        client.Authenticator = new HttpBasicAuthenticator(_authtoken, "x");
        var response = client.Execute<T>(request);

        string locationUrl = (string)response.Headers.Where(h => h.Type == ParameterType.HttpHeader && h.Name == "Location").SingleOrDefault().Value;
        int id;
        if (int.TryParse(locationUrl.Remove(0, string.Format("{0}{1}", client.BaseUrl, request.Resource).Length), out id))
        {              
            var secondRequest = new RestRequest();
            secondRequest.Resource = locationUrl.Remove(0, string.Format("{0}", client.BaseUrl).Length);
            secondRequest.RootElement = request.RootElement;
            return Execute<T>(secondRequest);
        }
        else        
            throw new ApplicationException("Could not get ID of newly created row");
    }

相关内容

  • 没有找到相关文章

最新更新