-
Notifications
You must be signed in to change notification settings - Fork 389
Expand file tree
/
Copy pathXmlHttpClient.cs
More file actions
100 lines (89 loc) · 3.28 KB
/
XmlHttpClient.cs
File metadata and controls
100 lines (89 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;
using Salesforce.Common.Internals;
using Salesforce.Common.Models.Json;
namespace Salesforce.Common
{
public class XmlHttpClient : BaseHttpClient, IXmlHttpClient
{
public XmlHttpClient(string instanceUrl, string apiVersion, string accessToken, HttpClient httpClient, bool callerWillDisposeHttpClient = false)
: base(instanceUrl, apiVersion, "application/xml", httpClient, callerWillDisposeHttpClient)
{
if (ApiVersion.StartsWith("v", StringComparison.OrdinalIgnoreCase))
{
ApiVersion = ApiVersion.Substring(1);
}
HttpClient.DefaultRequestHeaders.Add("X-SFDC-Session", accessToken);
}
// GET
public async Task<T> HttpGetAsync<T>(string urlSuffix)
{
var url = Common.FormatUrl(urlSuffix, InstanceUrl, ApiVersion);
return await HttpGetAsync<T>(url);
}
public async Task<T> HttpGetAsync<T>(Uri uri)
{
try
{
var response = await HttpGetAsync(uri);
return DeserializeXmlString<T>(response);
}
catch (BaseHttpClientException e)
{
throw ParseForceException(e.Message, e.GetStatus());
}
}
// POST
public async Task<T> HttpPostAsync<T>(object inputObject, string urlSuffix)
{
var url = Common.FormatUrl(urlSuffix, InstanceUrl, ApiVersion);
return await HttpPostAsync<T>(inputObject, url);
}
public async Task<T> HttpPostAsync<T>(object inputObject, Uri uri)
{
var postBody = SerializeXmlObject(inputObject);
try
{
var response = await HttpPostAsync(postBody, uri);
return DeserializeXmlString<T>(response);
}
catch (BaseHttpClientException e)
{
throw ParseForceException(e.Message, e.GetStatus());
}
}
// HELPER METHODS
private static ForceException ParseForceException(string responseMessage, HttpStatusCode statusCode)
{
var errorResponse = DeserializeXmlString<ErrorResponse>(responseMessage);
return new ForceException(errorResponse.ErrorCode, errorResponse.Message, statusCode);
}
private static string SerializeXmlObject(object inputObject)
{
var xmlSerializer = new XmlSerializer(inputObject.GetType());
var stringWriter = new StringWriter();
string result;
using (var writer = XmlWriter.Create(stringWriter))
{
xmlSerializer.Serialize(writer, inputObject);
result = stringWriter.ToString();
}
return result;
}
private static T DeserializeXmlString<T>(string inputString)
{
var serializer = new XmlSerializer(typeof(T));
T result;
using (TextReader reader = new StringReader(inputString))
{
result = (T) serializer.Deserialize(reader);
}
return result;
}
}
}