Skip to content

Commit d00ac62

Browse files
committed
Added support for querystring parameters for POST requests
1 parent 1be9a2d commit d00ac62

File tree

3 files changed

+176
-155
lines changed

3 files changed

+176
-155
lines changed

RestSharp.Tests/UrlBuilderTests.cs

Lines changed: 147 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -6,148 +6,161 @@
66

77
namespace RestSharp.Tests
88
{
9-
/// <summary>
10-
/// Note: These tests do not handle QueryString building, which is handled in Http, not RestClient
11-
/// </summary>
12-
public class UrlBuilderTests
13-
{
14-
[Fact]
15-
public void GET_with_leading_slash()
16-
{
17-
var request = new RestRequest("/resource");
18-
var client = new RestClient("http://example.com");
19-
20-
var expected = new Uri("http://example.com/resource");
21-
var output = client.BuildUri(request);
22-
23-
Assert.Equal(expected, output);
24-
}
25-
26-
[Fact]
27-
public void POST_with_leading_slash()
28-
{
29-
var request = new RestRequest("/resource", Method.POST);
30-
var client = new RestClient("http://example.com");
31-
32-
var expected = new Uri("http://example.com/resource");
33-
var output = client.BuildUri(request);
34-
35-
Assert.Equal(expected, output);
36-
}
37-
38-
[Fact]
39-
public void GET_with_leading_slash_and_baseurl_trailing_slash()
40-
{
41-
var request = new RestRequest("/resource");
42-
request.AddParameter("foo", "bar");
43-
var client = new RestClient("http://example.com/");
44-
45-
var expected = new Uri("http://example.com/resource?foo=bar");
46-
var output = client.BuildUri(request);
47-
48-
Assert.Equal(expected, output);
49-
}
50-
51-
[Fact]
52-
public void GET_wth_trailing_slash_and_query_parameters()
53-
{
54-
var request = new RestRequest("/resource/");
55-
var client = new RestClient("http://example.com");
56-
request.AddParameter( "foo", "bar" );
57-
58-
var expected = new Uri("http://example.com/resource/?foo=bar");
59-
var output = client.BuildUri(request);
60-
61-
var response = client.Execute( request );
62-
63-
Assert.Equal(expected, output);
64-
}
65-
66-
[Fact]
67-
public void POST_with_leading_slash_and_baseurl_trailing_slash()
68-
{
69-
var request = new RestRequest("/resource", Method.POST);
70-
var client = new RestClient("http://example.com/");
71-
72-
var expected = new Uri("http://example.com/resource");
73-
var output = client.BuildUri(request);
74-
75-
Assert.Equal(expected, output);
76-
}
77-
78-
[Fact]
79-
public void GET_with_resource_containing_slashes()
80-
{
81-
var request = new RestRequest("resource/foo");
82-
var client = new RestClient("http://example.com");
83-
84-
var expected = new Uri("http://example.com/resource/foo");
85-
var output = client.BuildUri(request);
86-
87-
Assert.Equal(expected, output);
88-
}
89-
90-
[Fact]
91-
public void POST_with_resource_containing_slashes()
92-
{
93-
var request = new RestRequest("resource/foo", Method.POST);
94-
var client = new RestClient("http://example.com");
95-
96-
var expected = new Uri("http://example.com/resource/foo");
97-
var output = client.BuildUri(request);
98-
99-
Assert.Equal(expected, output);
100-
}
101-
102-
[Fact]
103-
public void GET_with_resource_containing_tokens()
104-
{
105-
var request = new RestRequest("resource/{foo}");
106-
request.AddUrlSegment("foo", "bar");
107-
var client = new RestClient("http://example.com");
108-
109-
var expected = new Uri("http://example.com/resource/bar");
110-
var output = client.BuildUri(request);
111-
112-
Assert.Equal(expected, output);
113-
}
9+
/// <summary>
10+
/// Note: These tests do not handle QueryString building, which is handled in Http, not RestClient
11+
/// </summary>
12+
public class UrlBuilderTests
13+
{
14+
[Fact]
15+
public void GET_with_leading_slash()
16+
{
17+
var request = new RestRequest("/resource");
18+
var client = new RestClient("http://example.com");
19+
20+
var expected = new Uri("http://example.com/resource");
21+
var output = client.BuildUri(request);
22+
23+
Assert.Equal(expected, output);
24+
}
25+
26+
[Fact]
27+
public void POST_with_leading_slash()
28+
{
29+
var request = new RestRequest("/resource", Method.POST);
30+
var client = new RestClient("http://example.com");
31+
32+
var expected = new Uri("http://example.com/resource");
33+
var output = client.BuildUri(request);
34+
35+
Assert.Equal(expected, output);
36+
}
37+
38+
[Fact]
39+
public void GET_with_leading_slash_and_baseurl_trailing_slash()
40+
{
41+
var request = new RestRequest("/resource");
42+
request.AddParameter("foo", "bar");
43+
var client = new RestClient("http://example.com/");
44+
45+
var expected = new Uri("http://example.com/resource?foo=bar");
46+
var output = client.BuildUri(request);
47+
48+
Assert.Equal(expected, output);
49+
}
50+
51+
[Fact]
52+
public void GET_wth_trailing_slash_and_query_parameters()
53+
{
54+
var request = new RestRequest("/resource/");
55+
var client = new RestClient("http://example.com");
56+
request.AddParameter("foo", "bar");
57+
58+
var expected = new Uri("http://example.com/resource/?foo=bar");
59+
var output = client.BuildUri(request);
60+
61+
var response = client.Execute(request);
62+
63+
Assert.Equal(expected, output);
64+
}
65+
66+
[Fact]
67+
public void POST_with_leading_slash_and_baseurl_trailing_slash()
68+
{
69+
var request = new RestRequest("/resource", Method.POST);
70+
var client = new RestClient("http://example.com/");
71+
72+
var expected = new Uri("http://example.com/resource");
73+
var output = client.BuildUri(request);
74+
75+
Assert.Equal(expected, output);
76+
}
77+
78+
[Fact]
79+
public void GET_with_resource_containing_slashes()
80+
{
81+
var request = new RestRequest("resource/foo");
82+
var client = new RestClient("http://example.com");
83+
84+
var expected = new Uri("http://example.com/resource/foo");
85+
var output = client.BuildUri(request);
86+
87+
Assert.Equal(expected, output);
88+
}
89+
90+
[Fact]
91+
public void POST_with_resource_containing_slashes()
92+
{
93+
var request = new RestRequest("resource/foo", Method.POST);
94+
var client = new RestClient("http://example.com");
95+
96+
var expected = new Uri("http://example.com/resource/foo");
97+
var output = client.BuildUri(request);
98+
99+
Assert.Equal(expected, output);
100+
}
101+
102+
[Fact]
103+
public void GET_with_resource_containing_tokens()
104+
{
105+
var request = new RestRequest("resource/{foo}");
106+
request.AddUrlSegment("foo", "bar");
107+
var client = new RestClient("http://example.com");
108+
109+
var expected = new Uri("http://example.com/resource/bar");
110+
var output = client.BuildUri(request);
111+
112+
Assert.Equal(expected, output);
113+
}
114+
115+
[Fact]
116+
public void POST_with_resource_containing_tokens()
117+
{
118+
var request = new RestRequest("resource/{foo}", Method.POST);
119+
request.AddUrlSegment("foo", "bar");
120+
var client = new RestClient("http://example.com");
114121

115-
[Fact]
116-
public void POST_with_resource_containing_tokens()
117-
{
118-
var request = new RestRequest("resource/{foo}", Method.POST);
119-
request.AddUrlSegment("foo", "bar");
120-
var client = new RestClient("http://example.com");
122+
var expected = new Uri("http://example.com/resource/bar");
123+
var output = client.BuildUri(request);
121124

122-
var expected = new Uri("http://example.com/resource/bar");
123-
var output = client.BuildUri(request);
125+
Assert.Equal(expected, output);
126+
}
124127

125-
Assert.Equal(expected, output);
126-
}
128+
[Fact]
129+
public void GET_with_empty_request()
130+
{
131+
var request = new RestRequest();
132+
var client = new RestClient("http://example.com/resource");
127133

128-
[Fact]
129-
public void GET_with_empty_request()
130-
{
131-
var request = new RestRequest();
132-
var client = new RestClient("http://example.com/resource");
134+
var expected = new Uri("http://example.com/resource");
135+
var output = client.BuildUri(request);
133136

134-
var expected = new Uri("http://example.com/resource");
135-
var output = client.BuildUri(request);
137+
Assert.Equal(expected, output);
138+
}
136139

137-
Assert.Equal(expected, output);
138-
}
140+
[Fact]
141+
public void GET_with_empty_request_and_bare_hostname()
142+
{
143+
var request = new RestRequest();
144+
var client = new RestClient("http://example.com");
139145

140-
[Fact]
141-
public void GET_with_empty_request_and_bare_hostname()
142-
{
143-
var request = new RestRequest();
144-
var client = new RestClient("http://example.com");
146+
var expected = new Uri("http://example.com/");
147+
var output = client.BuildUri(request);
145148

146-
var expected = new Uri("http://example.com/");
147-
var output = client.BuildUri(request);
149+
Assert.Equal(expected, output);
150+
}
148151

149-
Assert.Equal(expected, output);
150-
}
152+
[Fact]
153+
public void POST_with_querystring_containing_tokens()
154+
{
155+
var request = new RestRequest("resource", Method.POST);
156+
request.AddParameter("foo", "bar", ParameterType.QueryString);
151157

152-
}
158+
var client = new RestClient("http://example.com");
159+
160+
var expected = new Uri("http://example.com/resource?foo=bar");
161+
var output = client.BuildUri(request);
162+
163+
Assert.Equal(expected, output);
164+
}
165+
}
153166
}

RestSharp/Enum.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public enum ParameterType
2525
GetOrPost,
2626
UrlSegment,
2727
HttpHeader,
28-
RequestBody
28+
RequestBody,
29+
QueryString
2930
}
3031

3132
/// <summary>

RestSharp/RestClient.cs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -257,30 +257,37 @@ public Uri BuildUri(IRestRequest request)
257257
}
258258
}
259259

260-
if (request.Method != Method.POST
261-
&& request.Method != Method.PUT
262-
&& request.Method != Method.PATCH)
263-
{
264-
// build and attach querystring if this is a get-style request
265-
if (request.Parameters.Any(p => p.Type == ParameterType.GetOrPost))
266-
{
267-
var data = EncodeParameters(request);
268-
assembled = string.Format("{0}?{1}", assembled, data);
269-
}
270-
}
260+
IEnumerable<Parameter> parameters = null;
261+
262+
if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH)
263+
{
264+
// build and attach querystring if this is a get-style request
265+
parameters = request.Parameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString);
266+
}
267+
else
268+
{
269+
parameters = request.Parameters.Where(p => p.Type == ParameterType.QueryString);
270+
}
271+
272+
// build and attach querystring
273+
if (parameters != null && parameters.Any())
274+
{
275+
var data = EncodeParameters(request, parameters);
276+
assembled = string.Format("{0}?{1}", assembled, data);
277+
}
271278

272279
return new Uri(assembled);
273280
}
274281

275-
private string EncodeParameters(IRestRequest request)
276-
{
277-
var querystring = new StringBuilder();
278-
foreach (var p in request.Parameters.Where(p => p.Type == ParameterType.GetOrPost))
279-
{
280-
if (querystring.Length > 1)
281-
querystring.Append("&");
282-
querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), (p.Value.ToString()).UrlEncode());
283-
}
282+
private string EncodeParameters(IRestRequest request, IEnumerable<Parameter> parameters)
283+
{
284+
var querystring = new StringBuilder();
285+
foreach (var p in parameters)
286+
{
287+
if (querystring.Length > 1)
288+
querystring.Append("&");
289+
querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), (p.Value.ToString()).UrlEncode());
290+
}
284291

285292
return querystring.ToString();
286293
}

0 commit comments

Comments
 (0)