Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b8bee7c

Browse files
author
Hariharan Subramanian
committed
Handled exceptions / Added BaseResponse, Other clients will be changed to similar structure
1 parent e8d39b1 commit b8bee7c

File tree

11 files changed

+304
-31
lines changed

11 files changed

+304
-31
lines changed

‎Sample/StackExchange.NET_Example/Program.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ static void Main(string[] args)
1515
{
1616
PageSize = 1,
1717
Page = 1,
18-
Sort = AnswerSort.Votes
18+
Sort = Sort.Votes
1919
};
2020
//var answers = client.Answers.GetAllAnswers(queryString);
2121
var ids = new List<string>()
@@ -55,8 +55,32 @@ static void Main(string[] args)
5555
{
5656
"102165885", "102166303"
5757
};
58-
var comments = client.Comments.GetCommentsByIds(commentIds,commentFilter);
59-
Console.WriteLine(JsonConvert.SerializeObject(comments));
58+
//var comments = client.Comments.GetCommentsByIds(commentIds,commentFilter);
59+
//Console.WriteLine(JsonConvert.SerializeObject(comments));
60+
61+
var postFilter = new PostFilter()
62+
{
63+
Sort = PostSort.Creation
64+
};
65+
//var posts = client.Posts.GetAllPosts(postFilter);
66+
67+
var postIds = new List<string>()
68+
{
69+
"57871119", "57698255"
70+
};
71+
72+
//var postsByIds = client.Posts.GetAllPostsByIds(postIds, postFilter);
73+
74+
//var postsByIds = client.Posts.GetCommentsOnPosts(postIds, postFilter);
75+
76+
//var revisionByIds = client.Posts.GetRevisionsByIds(postIds, postFilter);
77+
78+
var suggestedEdits = client.Posts.GetSuggestedEdits(postIds, new SuggestedEditFilter()
79+
{
80+
Sort = Sort.Activity
81+
});
82+
83+
Console.WriteLine(JsonConvert.SerializeObject(suggestedEdits));
6084
Console.ReadKey();
6185
}
6286
}

‎StackExchange.NET/StackExchange.NET/Clients/Answers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Answers IAnswers.GetAnswerByIds(List<string> ids, AnswerFilters filters)
3636
return answers;
3737
}
3838

39-
publicAnswers GetCommentsByIds(List<string> ids, AnswerFilters filters)
39+
Answers IAnswers.GetCommentsByIds(List<string> ids, AnswerFilters filters)
4040
{
4141
var apiParams = filters.GetQueryParams();
4242
var url = $"{_baseApiUrl}/answers/";
@@ -47,7 +47,7 @@ public Answers GetCommentsByIds(List<string> ids, AnswerFilters filters)
4747
return answers;
4848
}
4949

50-
publicQuestions GetQuestionByAnswerIds(List<string> ids, AnswerFilters filters)
50+
Questions IAnswers.GetQuestionByAnswerIds(List<string> ids, AnswerFilters filters)
5151
{
5252
var apiParams = filters.GetQueryParams();
5353
var url = $"{_baseApiUrl}/answers/";

‎StackExchange.NET/StackExchange.NET/Clients/Badges.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public partial class StackExchangeClient : IBadges
1414
{
1515
public IBadges Badges => this;
1616

17-
publicBadges GetAllBadges(BadgeFilters filters, string inName=null)
17+
Badges IBadges.GetAllBadges(BadgeFilters filters, string inName)
1818
{
1919
var apiParams = filters.GetQueryParams();
2020
var url = $"{_baseApiUrl}/badges?key={_apiKey}&{apiParams}&inname={inName}";
@@ -23,7 +23,7 @@ public Badges GetAllBadges(BadgeFilters filters, string inName = null)
2323
return badges;
2424
}
2525

26-
publicBadges GetBadgesByIds(List<string> ids, BadgeFilters filters)
26+
Badges IBadges.GetBadgesByIds(List<string> ids, BadgeFilters filters)
2727
{
2828
var apiParams = filters.GetQueryParams();
2929
var url = $"{_baseApiUrl}/badges/";
@@ -34,7 +34,7 @@ public Badges GetBadgesByIds(List<string> ids, BadgeFilters filters)
3434
return badges;
3535
}
3636

37-
publicBadges GetNonTaggedBadges(List<string> ids, BadgeFilters filters)
37+
Badges IBadges.GetNonTaggedBadges(List<string> ids, BadgeFilters filters)
3838
{
3939
var apiParams = filters.GetQueryParams();
4040
var url = $"{_baseApiUrl}/badges/name";
@@ -45,7 +45,7 @@ public Badges GetNonTaggedBadges(List<string> ids, BadgeFilters filters)
4545
return badges;
4646
}
4747

48-
publicBadges GetRecentlyAwardedBadges(BadgeFilters filters)
48+
Badges IBadges.GetRecentlyAwardedBadges(BadgeFilters filters)
4949
{
5050
var apiParams = filters.GetQueryParams();
5151
var url = $"{_baseApiUrl}/badges/recipients"+ $"?key={_apiKey}&{apiParams}";
@@ -54,7 +54,7 @@ public Badges GetRecentlyAwardedBadges(BadgeFilters filters)
5454
return badges;
5555
}
5656

57-
publicBadges GetRecentlyAwardedBadgesByIds(List<string> ids, BadgeFilters filters)
57+
Badges IBadges.GetRecentlyAwardedBadgesByIds(List<string> ids, BadgeFilters filters)
5858
{
5959
var apiParams = filters.GetQueryParams();
6060
var url = $"{_baseApiUrl}/badges/";
@@ -65,7 +65,7 @@ public Badges GetRecentlyAwardedBadgesByIds(List<string> ids, BadgeFilters filte
6565
return badges;
6666
}
6767

68-
publicBadges GetAllTaggedBadges(BadgeFilters filters, string inName=null)
68+
Badges IBadges.GetAllTaggedBadges(BadgeFilters filters, string inName)
6969
{
7070
var apiParams = filters.GetQueryParams();
7171
var url = $"{_baseApiUrl}/badges/tags"+ $"?key={_apiKey}&{apiParams}";
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#region Using Directives
2+
3+
using System.Collections.Generic;
4+
using System.Web;
5+
using StackExchange.NET.Interfaces;
6+
using StackExchange.NET.Models;
7+
8+
#endregion
9+
10+
namespace StackExchange.NET.Clients
11+
{
12+
public partial class StackExchangeClient : IPosts
13+
{
14+
public IPosts Posts => this;
15+
16+
BaseResponse<Posts> IPosts.GetAllPosts(PostFilter filters)
17+
{
18+
var apiParams = filters.GetQueryParams();
19+
var url = $"{_baseApiUrl}/posts?key={_apiKey}&{apiParams}";
20+
var response = _httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
21+
var apiResult = response.DeserializeJson<Data<Posts>>().ValidateApiResponse();
22+
return apiResult;
23+
}
24+
25+
BaseResponse<Posts> IPosts.GetAllPostsByIds(List<string> ids, PostFilter filters)
26+
{
27+
var apiParams = filters.GetQueryParams();
28+
var url = $"{_baseApiUrl}/posts/";
29+
var idsToEncode = string.Join(";", ids.ToArray());
30+
url = url + $"{HttpUtility.UrlEncode(idsToEncode)}" + $"?key={_apiKey}&{apiParams}";
31+
var response = _httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
32+
var apiResult = response.DeserializeJson<Data<Posts>>().ValidateApiResponse();
33+
return apiResult;
34+
}
35+
36+
BaseResponse<Posts> IPosts.GetCommentsOnPosts(List<string> ids, PostFilter filters)
37+
{
38+
var apiParams = filters.GetQueryParams();
39+
var url = $"{_baseApiUrl}/posts/";
40+
var idsToEncode = string.Join(";", ids.ToArray());
41+
url = url + $"{HttpUtility.UrlEncode(idsToEncode)}/comments" + $"?key={_apiKey}&{apiParams}";
42+
var response = _httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
43+
var apiResult = response.DeserializeJson<Data<Posts>>().ValidateApiResponse();
44+
return apiResult;
45+
}
46+
47+
BaseResponse<Posts> IPosts.GetRevisionsByIds(List<string> ids, PostFilter filters)
48+
{
49+
var apiParams = filters.GetQueryParams();
50+
var url = $"{_baseApiUrl}/posts/";
51+
var idsToEncode = string.Join(";", ids.ToArray());
52+
url = url + $"{HttpUtility.UrlEncode(idsToEncode)}/revisions" + $"?key={_apiKey}&{apiParams}";
53+
var response = _httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
54+
var apiResult = response.DeserializeJson<Data<Posts>>().ValidateApiResponse();
55+
return apiResult;
56+
}
57+
58+
BaseResponse<Posts> IPosts.GetSuggestedEdits(List<string> ids, SuggestedEditFilter filters)
59+
{
60+
var apiParams = filters.GetQueryParams();
61+
var url = $"{_baseApiUrl}/posts/";
62+
var idsToEncode = string.Join(";", ids.ToArray());
63+
url = url + $"{HttpUtility.UrlEncode(idsToEncode)}/suggested-edits" + $"?key={_apiKey}&{apiParams}";
64+
var response = _httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
65+
var apiResult = response.DeserializeJson<Data<Posts>>().ValidateApiResponse();
66+
return apiResult;
67+
}
68+
}
69+
}

‎StackExchange.NET/StackExchange.NET/Clients/StackExchangeClient.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
using System.Net;
1+
using System;
2+
using System.Net;
23
using System.Net.Http;
4+
using Newtonsoft.Json;
5+
using StackExchange.NET.Models;
36

47
namespace StackExchange.NET.Clients
58
{
@@ -19,5 +22,11 @@ public StackExchangeClient(string apiKey)
1922
};
2023
_httpClient = new HttpClient(httpClientHandler);
2124
}
25+
26+
public string ListType<T>(T value)
27+
{
28+
var valueType = value.GetType().GenericTypeArguments[0].FullName;
29+
return valueType;
30+
}
2231
}
2332
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
3+
namespace StackExchange.NET.Exceptions
4+
{
5+
public class StackExchangeApiException : Exception
6+
{
7+
/// <summary>
8+
/// Create a new StackExchangeApiException
9+
/// </summary>
10+
public StackExchangeApiException(long errorId, string errorName, string errorMessage)
11+
: base($"{errorName} - {errorId}: {errorMessage}")
12+
{
13+
ErrorId = errorId;
14+
ErrorName = errorName;
15+
ErrorMessage = errorMessage;
16+
}
17+
18+
/// <summary>
19+
/// error_id
20+
/// </summary>
21+
public readonly long ErrorId;
22+
23+
/// <summary>
24+
/// error_name
25+
/// </summary>
26+
public readonly string ErrorName;
27+
28+
/// <summary>
29+
/// error_message
30+
/// </summary>
31+
public readonly string ErrorMessage;
32+
}
33+
}

‎StackExchange.NET/StackExchange.NET/ExtensionMethods.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Web;
5+
using Newtonsoft.Json;
56
using StackExchange.NET.Models;
67

78
namespace StackExchange.NET
@@ -39,6 +40,30 @@ internal static string GetQueryParams(this Filter filters)
3940

4041
return dictionary.ToQueryString();
4142
}
43+
44+
internal static T DeserializeJson<T>(this string serializedData)
45+
{
46+
return JsonConvert.DeserializeObject<T>(serializedData);
47+
}
48+
49+
internal static BaseResponse<T> ValidateApiResponse<T>(this Data<T> data)
50+
{
51+
var result = new BaseResponse<T>();
52+
try
53+
{
54+
if (data.ErrorId.HasValue)
55+
throw new Exceptions.StackExchangeApiException(data.ErrorId.Value, data.ErrorName, data.ErrorMessage);
56+
57+
result.Data = data;
58+
result.Success = true;
59+
}
60+
catch (Exception ex)
61+
{
62+
result.Exception = ex;
63+
result.Success = false;
64+
}
65+
return result;
66+
}
4267
}
4368

4469
internal static class DateTimeExtensions
@@ -50,4 +75,5 @@ public static dynamic ToUnixTime(this DateTime? dateTime)
5075
return null;
5176
}
5277
}
78+
5379
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Collections.Generic;
2+
using StackExchange.NET.Models;
3+
4+
namespace StackExchange.NET.Interfaces
5+
{
6+
public interface IPosts
7+
{
8+
BaseResponse<Posts> GetAllPosts(PostFilter filter);
9+
BaseResponse<Posts> GetAllPostsByIds(List<string> ids, PostFilter postFilter);
10+
BaseResponse<Posts> GetCommentsOnPosts(List<string> ids, PostFilter filter);
11+
BaseResponse<Posts> GetRevisionsByIds(List<string> ids, PostFilter filter);
12+
BaseResponse<Posts> GetSuggestedEdits(List<string> ids, SuggestedEditFilter filter);
13+
}
14+
}

‎StackExchange.NET/StackExchange.NET/Models/Answers.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,13 @@ public class Answer
4444
[JsonProperty("question_id")]
4545
public long QuestionId { get; set; }
4646
}
47-
public enum AnswerSort
48-
{
49-
Activity,
50-
Votes,
51-
Creation
52-
}
53-
47+
5448
public class AnswerFilters : Filter
5549
{
5650
public AnswerFilters()
5751
{
5852
Order = Models.Order.Desc;
59-
Sort = AnswerSort.Activity;
53+
Sort = Models.Sort.Activity;
6054
Site = "stackoverflow";
6155
}
6256
}

‎StackExchange.NET/StackExchange.NET/Models/Base.cs

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,39 @@
11
using System;
22
using System.Collections.Generic;
3+
using Newtonsoft.Json;
34

45
namespace StackExchange.NET.Models
56
{
6-
public interfaceIBaseApiResponse
7+
public classBaseResponse<T>
78
{
8-
bool Status { get; set; }
9-
}
10-
public interface IBaseResponse<T> : IBaseApiResponse
11-
{
12-
List<T> Items { get; set; }
13-
bool HasMore { get; set; }
14-
int QuotaMax { get; set; }
15-
int QuotaRemaining { get; set; }
9+
public bool Success { get; set; }
10+
public Data<T> Data { get; set; }
11+
public Exception Exception { get; set; }
12+
1613
}
1714

18-
public abstractclass BaseApiRequest
15+
public class Data<T>
1916
{
20-
public AnswerFilters AnswerFilters { get; set; }
17+
[JsonProperty("error_id")]
18+
public long? ErrorId { get; set; }
19+
20+
[JsonProperty("error_message")]
21+
public string ErrorMessage { get; set; }
22+
23+
[JsonProperty("error_name")]
24+
public string ErrorName { get; set; }
25+
[JsonProperty("items")]
26+
public List<T> Items { get; set; }
27+
28+
[JsonProperty("has_more")]
29+
public bool HasMore { get; set; }
30+
31+
[JsonProperty("quota_max")]
32+
public long QuotaMax { get; set; }
33+
34+
[JsonProperty("quota_remaining")]
35+
public long QuotaRemaining { get; set; }
36+
2137
}
2238

2339
public enum Order
@@ -26,6 +42,12 @@ public enum Order
2642
Desc
2743
}
2844

45+
public enum Sort
46+
{
47+
Activity,
48+
Votes,
49+
Creation
50+
}
2951
public class Filter
3052
{
3153
public int? Page { get; set; }

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /