Skip to content

Commit 46d0e8e

Browse files
committed
set args and data in builder, created UrlHelper, some refactor
1 parent a24d561 commit 46d0e8e

File tree

6 files changed

+101
-58
lines changed

6 files changed

+101
-58
lines changed

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@ Simple REST client on D language
1717
* ~~User Agent~~
1818
* ~~DELETE request~~
1919
* ~~PATCH request~~
20-
* Set args and data in builder
21-
* PUT request
20+
* ~~Add package.d file~~
21+
* ~~Set args and data in builder~~
22+
* ~~Add UrlHelper~~
2223

2324
[0.3]
25+
* First release in http://code.dlang.org/
2426
* VK sample
2527
* httpbin.org sample
2628
* Dynamic parameters in URL
29+
* PUT request
30+
* Unit Tests
2731

2832
[0.4]
2933
* Multipart/form-data
@@ -38,7 +42,6 @@ Simple REST client on D language
3842
* Documentation
3943
* wiki
4044
* javadoc
41-
* Unit Tests
4245
* RX support
4346
* Json serialization/deserialization
4447
* OAuth 2

source/app.d

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
import std.net.curl;
22
import std.stdio;
33

4-
import mars.AsyncHttpClient;
5-
import mars.HttpClient;
6-
import mars.HttpClientOptions;
7-
import mars.HttpResponseHandler;
8-
import mars.Request;
9-
import mars.RequestParams;
10-
import mars.ServerException;
4+
import mars;
115

126
string BASE_URL = "https://httpbin.org/";
137

@@ -24,42 +18,42 @@ void main()
2418

2519
Request postRequest = new Request.Builder()
2620
.url("post?name=Eugene")
27-
.params(params)
21+
.data(params.toJson)
2822
.headers(["Custom-Header1" : "value1", "Custom-Header2" : "value2"])
2923
.build();
30-
client.post(postRequest, new CredentialsHttpResponseHandler);
24+
client.post(postRequest, new ResponseListener);
3125

3226
Request getRequest = new Request.Builder()
3327
.url("get?name=Eugene&key1=value1&key2=value2")
34-
.params(params)
28+
.data(params.toJson)
3529
.headers(["Custom-Header3" : "value3", "Custom-Header4" : "value4", "Content-Type" : "Custon Content Type"])
3630
.build();
37-
client.get(getRequest, new CredentialsHttpResponseHandler);
31+
client.get(getRequest, new ResponseListener);
3832

3933
Request delRequest = new Request.Builder()
4034
.url("delete?name=Eugene&key1=value1&key2=value2")
41-
.params(params)
35+
.data(params.toJson)
4236
.headers(["Custom-Header5" : "value5"])
4337
.build();
44-
client.del(delRequest, new CredentialsHttpResponseHandler);
38+
client.del(delRequest, new ResponseListener);
4539

4640
Request patchRequest = new Request.Builder()
4741
.url("patch?name=Eugene&key1=value1&key2=value2")
48-
.params(params)
42+
.data(params.toJson)
4943
.headers(["Custom-Header5" : "value5"])
5044
.build();
51-
client.patch(patchRequest, new CredentialsHttpResponseHandler);
45+
client.patch(patchRequest, new ResponseListener);
5246

5347
Request putRequest = new Request.Builder()
5448
.url("put")
55-
.params(params)
49+
.data(params.toJson)
5650
.headers(["Custom-Header6" : "value6"])
5751
.build();
58-
//client.put(putRequest, new CredentialsHttpResponseHandler);
52+
//client.put(putRequest, new ResponseListener);
5953
//writeln(put("https://httpbin.org/put", "Hi!"));
6054
}
6155

62-
private class CredentialsHttpResponseHandler : HttpResponseHandler {
56+
private class ResponseListener : HttpResponseHandler {
6357
void onSuccess(int statusCode, string[string] headers, ubyte[] responseBody) {
6458
import std.conv;
6559

source/mars/AsyncHttpClient.d

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import mars.Request;
99
import mars.RequestParams;
1010
import mars.ServerException;
1111
import mars.StatusCode;
12+
import mars.UrlHelper;
1213

1314
class AsyncHttpClient : HttpClient {
1415

@@ -50,39 +51,21 @@ class AsyncHttpClient : HttpClient {
5051
import std.stdio;
5152
import std.conv;
5253

53-
string url = getCorrectUrl(request.getUrl);
54-
writeln("url: ", url);
55-
5654
int statusCode = StatusCode.BAD_REQUEST;
5755
string[string] responseHeaders;
5856
ubyte[] responseBody;
5957

6058
mHttp.method = httpMethod;
61-
if (httpMethod == HTTP.Method.post || httpMethod == HTTP.Method.del || httpMethod == HTTP.Method.patch || httpMethod == HTTP.Method.put) {
62-
mHttp.url = url;
59+
mHttp.url = UrlHelper.createUrl(mOptions.baseUrl, request.getUrl, request.getParams);
60+
61+
if (httpMethod != HTTP.Method.get) {
6362
string contentType = "Content-Type" in mOptions.headers ? mOptions.headers["Content-Type"] : null;
6463
if (contentType is null) {
6564
contentType = "Content-Type" in request.getHeaders ? request.getHeaders["Content-Type"] : "application/json";
6665
}
67-
mHttp.setPostData(request.getParams.toJson, contentType);
68-
} else if (httpMethod == HTTP.Method.get) {
69-
string[string] paramsToSend = request.getParams.getParams;
70-
71-
if (paramsToSend !is null && paramsToSend.length > 0) {
72-
import std.string;
73-
import std.algorithm.searching;
74-
import std.algorithm.iteration;
75-
76-
string urlParams = paramsToSend.keys.map!(k => k ~ "=" ~ paramsToSend[k]).join("&");
77-
if (canFind(url, "?")) {
78-
mHttp.url = url ~ "&" ~ urlParams;
79-
} else {
80-
mHttp.url = url ~ "?" ~ urlParams;
81-
}
82-
} else {
83-
mHttp.url = url;
84-
}
66+
mHttp.setPostData(request.getData, contentType);
8567
}
68+
8669
if (request.getHeaders != null && request.getHeaders.length > 0) {
8770
foreach (name, value; request.getHeaders) {
8871
mHttp.addRequestHeader(name, value);
@@ -128,18 +111,4 @@ class AsyncHttpClient : HttpClient {
128111
}
129112
}
130113
}
131-
132-
private string getCorrectUrl(string url) {
133-
import std.exception;
134-
135-
enforce(mOptions.baseUrl !is null, new Exception("Cannot get URL, please, set base URL!"));
136-
137-
import std.algorithm.searching;
138-
139-
if (url.startsWith("http")) {
140-
return url;
141-
}
142-
143-
return mOptions.baseUrl ~ url;
144-
}
145114
}

source/mars/Request.d

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class Request {
66

77
private string url;
88
private RequestParams params;
9+
private string data;
910
private string[string] headers;
1011

1112
string getUrl() {
@@ -16,19 +17,25 @@ class Request {
1617
return params;
1718
}
1819

20+
string getData() {
21+
return data;
22+
}
23+
1924
string[string] getHeaders() {
2025
return headers;
2126
}
2227

2328
private this(Builder builder) {
2429
url = builder.mUrl;
2530
params = builder.mParams;
31+
data = builder.mData;
2632
headers = builder.mHeaders;
2733
}
2834

2935
static class Builder {
3036
private string mUrl;
3137
private RequestParams mParams;
38+
private string mData;
3239
private string[string] mHeaders;
3340

3441
Builder url(string value) {
@@ -41,6 +48,11 @@ class Request {
4148
return this;
4249
}
4350

51+
Builder data(string value) {
52+
mData = value;
53+
return this;
54+
}
55+
4456
Builder headers(string[string] value) {
4557
mHeaders = value;
4658
return this;

source/mars/UrlHelper.d

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
module mars.UrlHelper;
2+
3+
import std.algorithm.searching;
4+
import std.exception;
5+
6+
version(unittest) {
7+
import std.stdio;
8+
}
9+
10+
import mars.RequestParams;
11+
12+
class UrlHelper {
13+
14+
static string createUrl(string baseUrl, string requestUrl, RequestParams params) {
15+
enforce(requestUrl !is null, new Exception("Cannot get request Url!"));
16+
17+
if (requestUrl.startsWith("http")) {
18+
return addArgsIfNeed(requestUrl, params);
19+
}
20+
21+
enforce(baseUrl !is null, new Exception("Cannot get base Url!"));
22+
23+
return baseUrl ~ addArgsIfNeed(requestUrl, params);
24+
}
25+
26+
private static string addArgsIfNeed(string url, RequestParams params) {
27+
if (params is null || params.getParams.length == 0) {
28+
return url;
29+
}
30+
31+
import std.string;
32+
import std.algorithm.iteration;
33+
34+
string[string] args = params.getParams;
35+
36+
string urlParams = args.keys.map!(k => k ~ "=" ~ args[k]).join("&");
37+
if (canFind(url, "?")) {
38+
url = url ~ "&" ~ urlParams;
39+
} else {
40+
url = url ~ "?" ~ urlParams;
41+
}
42+
43+
return url;
44+
}
45+
}
46+
47+
unittest {
48+
try {
49+
UrlHelper.createUrl(null, null, null);
50+
assert(false);
51+
} catch (Exception e) {
52+
writeln(e.msg);
53+
assert(e !is null);
54+
assert(e.msg == "Cannot get request Url!");
55+
}
56+
}

source/mars/package.d

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module mars;
2+
3+
package import mars.AsyncHttpClient;
4+
package import mars.HttpClient;
5+
package import mars.HttpClientOptions;
6+
package import mars.HttpResponseHandler;
7+
package import mars.Request;
8+
package import mars.RequestParams;
9+
package import mars.ServerException;

0 commit comments

Comments
 (0)