我正在使用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");
}