diff --git a/README.md b/README.md index c06052027674cccee2345ecc17059a2a85c0dd04..94d3ef2fc3fd3a6bea789c8e5cc4f693c0c5edfc 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ - Jaskson Read Write HttpMessageConverter,分读写的消息转换器。 - Spring 枚举转换器,规则同 Jackson。 -### mica-okhttp -- `okhttp` 的简单 http 工具包,语法参考 HttpClient Fluent API +### mica-http +- `mica-http` 是 `okhttp` 的封装,Fluent 语法的 http 工具包,语法参考 HttpClient Fluent API。 ### mica-launcher - 项目启动器 diff --git a/mica-bom/README.md b/mica-bom/README.md index 2b59608c9a53b674b26869771982d7eef2b95b27..9c7d2714b91f7c8002b7aa6aecb6a35091140454 100644 --- a/mica-bom/README.md +++ b/mica-bom/README.md @@ -36,7 +36,7 @@ net.dreamlu `artifactId`: ```text mica-core -mica-okhttp +mica-http mica-launcher mica-log4j2 mica-boot diff --git a/mica-bom/build.gradle b/mica-bom/build.gradle index 8b8e687c6250136f6ce51ee2724438661a0926a9..2288755289ef62cfdd61f9d314dd98ab079830a6 100644 --- a/mica-bom/build.gradle +++ b/mica-bom/build.gradle @@ -16,7 +16,7 @@ dependencyManagement { // mica dependency "net.dreamlu:mica-auto:${micaAutoVersion}" dependency "net.dreamlu:mica-core:${VERSION}" - dependency "net.dreamlu:mica-okhttp:${VERSION}" + dependency "net.dreamlu:mica-http:${VERSION}" dependency "net.dreamlu:mica-launcher:${VERSION}" dependency "net.dreamlu:mica-log4j2:${VERSION}" dependency "net.dreamlu:mica-boot:${VERSION}" diff --git a/mica-okhttp/README.md b/mica-http/README.md similarity index 65% rename from mica-okhttp/README.md rename to mica-http/README.md index 95c735e010241626fcac5eec03b3bcf4b9b9ae2c..bcb841cd6763fae067fb80ddebd9ed4ecaf60b65 100644 --- a/mica-okhttp/README.md +++ b/mica-http/README.md @@ -1,25 +1,25 @@ # mica-okhttp -`mica-okhttp` 是基于 `okhttp` 的简单 http 工具包,语法参考 HttpClient Fluent API(fluent-hc)。 +`mica-http` 是 `okhttp` 的封装,Fluent 语法的 http 工具包,语法参考 HttpClient Fluent API。 ## 使用 ### maven ```xml net.dreamlu - mica-okhttp + mica-http ${version} ``` ### gradle ```groovy -compile("net.dreamlu:mica-okhttp:${version}") +compile("net.dreamlu:mica-http:${version}") ``` ### 示例代码 ```java private String getUserEmail(String accessToken) { - return XRequest.get("https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))") + return HttpRequest.get("https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))") .addHeader("Host", "api.linkedin.com") .addHeader("Connection", "Keep-Alive") .addHeader("Authorization", "Bearer " + accessToken) @@ -31,7 +31,7 @@ private String getUserEmail(String accessToken) { } public static void test() { - XRequest.post("https://www.baidu.com/do-stuff") + HttpRequest.post("https://www.baidu.com/do-stuff") .log(HttpLoggingInterceptor.Level.BASIC) .formBuilder() .add("a", "b") diff --git a/mica-okhttp/build.gradle b/mica-http/build.gradle similarity index 100% rename from mica-okhttp/build.gradle rename to mica-http/build.gradle diff --git a/mica-http/src/main/java/net/dreamlu/http/BaseAuthenticator.java b/mica-http/src/main/java/net/dreamlu/http/BaseAuthenticator.java new file mode 100644 index 0000000000000000000000000000000000000000..29673e7740287395001da0bc6feac83b36354212 --- /dev/null +++ b/mica-http/src/main/java/net/dreamlu/http/BaseAuthenticator.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2019-2029, Dreamlu (596392912@qq.com & www.dreamlu.net). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.dreamlu.http; + +import lombok.RequiredArgsConstructor; +import okhttp3.*; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * BaseAuth + * + * @author L.cm + */ +@RequiredArgsConstructor +public class BaseAuthenticator implements Authenticator { + private final String userName; + private final String password; + + @Override + public Request authenticate(Route route, Response response) throws IOException { + String credential = Credentials.basic(userName, password, StandardCharsets.UTF_8); + return response.request().newBuilder() + .header("Authorization", credential) + .build(); + } +} diff --git a/mica-okhttp/src/main/java/net/dreamlu/http/XFormBuilder.java b/mica-http/src/main/java/net/dreamlu/http/FormBuilder.java similarity index 80% rename from mica-okhttp/src/main/java/net/dreamlu/http/XFormBuilder.java rename to mica-http/src/main/java/net/dreamlu/http/FormBuilder.java index 2858f1bc1113b7cb032437d9eab91b8738c063a6..00adfe2b54ea0b4fb2ed034c487e167ceb57d411 100644 --- a/mica-okhttp/src/main/java/net/dreamlu/http/XFormBuilder.java +++ b/mica-http/src/main/java/net/dreamlu/http/FormBuilder.java @@ -23,32 +23,32 @@ import okhttp3.FormBody; * * @author L.cm */ -public class XFormBuilder { - private final XRequest request; +public class FormBuilder { + private final HttpRequest request; private final FormBody.Builder formBuilder; - XFormBuilder(XRequest request) { + FormBuilder(HttpRequest request) { this.request = request; this.formBuilder = new FormBody.Builder(); } - public XFormBuilder add(String name, String value) { + public FormBuilder add(String name, String value) { this.formBuilder.add(name, value); return this; } - public XFormBuilder addEncoded(String name, String value) { + public FormBuilder addEncoded(String name, String value) { this.formBuilder.addEncoded(name, value); return this; } - public XRequest build() { + public HttpRequest build() { FormBody formBody = formBuilder.build(); this.request.form(formBody); return this.request; } - public XResponse execute() { + public HttpResponse execute() { return this.build().execute(); } } diff --git a/mica-okhttp/src/main/java/net/dreamlu/http/XRequest.java b/mica-http/src/main/java/net/dreamlu/http/HttpRequest.java similarity index 64% rename from mica-okhttp/src/main/java/net/dreamlu/http/XRequest.java rename to mica-http/src/main/java/net/dreamlu/http/HttpRequest.java index e09b97edc9baaeb1647d38b09dc8aa4c24ad6ea4..029fc7bae7d09aa3f563aeb146684eee1b3fcca0 100644 --- a/mica-okhttp/src/main/java/net/dreamlu/http/XRequest.java +++ b/mica-http/src/main/java/net/dreamlu/http/HttpRequest.java @@ -27,6 +27,7 @@ import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URI; import java.time.Duration; +import java.util.Map; import java.util.concurrent.TimeUnit; /** @@ -34,7 +35,7 @@ import java.util.concurrent.TimeUnit; * * @author L.cm */ -public class XRequest { +public class HttpRequest { private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"; private static OkHttpClient httpClient = new OkHttpClient(); private final Request.Builder requestBuilder; @@ -45,103 +46,104 @@ public class XRequest { private Boolean followRedirects; private HttpLoggingInterceptor.Level level; private Interceptor interceptor; + private Authenticator authenticator; private Duration connectTimeout; private Duration readTimeout; private Duration writeTimeout; private Proxy proxy; - public static XRequest get(final String url) { + public static HttpRequest get(final String url) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.GET); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.GET); } - public static XRequest get(final URI uri) { + public static HttpRequest get(final URI uri) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(uri); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.GET); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.GET); } - public static XRequest post(final String url) { + public static HttpRequest post(final String url) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.POST); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.POST); } - public static XRequest post(final URI uri) { + public static HttpRequest post(final URI uri) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(uri); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.POST); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.POST); } - public static XRequest patch(final String url) { + public static HttpRequest patch(final String url) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.PATCH); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.PATCH); } - public static XRequest patch(final URI uri) { + public static HttpRequest patch(final URI uri) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(uri); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.PATCH); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.PATCH); } - public static XRequest put(final String url) { + public static HttpRequest put(final String url) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.PUT); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.PUT); } - public static XRequest put(final URI uri) { + public static HttpRequest put(final URI uri) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(uri); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.PUT); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.PUT); } - public static XRequest delete(final String url) { + public static HttpRequest delete(final String url) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.DELETE); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.DELETE); } - public static XRequest delete(final URI uri) { + public static HttpRequest delete(final URI uri) { UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(uri); - return new XRequest(new Request.Builder(), uriBuilder, XMethod.DELETE); + return new HttpRequest(new Request.Builder(), uriBuilder, Method.DELETE); } private static RequestBody emptyBody() { return RequestBody.create(null, new byte[0]); } - public XRequest query(String name, Object... values) { + public HttpRequest query(String name, Object... values) { this.uriBuilder.queryParam(name, values); return this; } - XRequest form(FormBody formBody) { + HttpRequest form(FormBody formBody) { this.requestBody = formBody; return this; } - XRequest formPart(MultipartBody multipartBody) { + HttpRequest multipartForm(MultipartBody multipartBody) { this.requestBody = multipartBody; return this; } - public XFormBuilder formBuilder() { - return new XFormBuilder(this); + public FormBuilder formBuilder() { + return new FormBuilder(this); } - public XFormPartBuilder formPartBuilder() { - return new XFormPartBuilder(this); + public MultipartFormBuilder multipartFormBuilder() { + return new MultipartFormBuilder(this); } - public XRequest body(RequestBody requestBody) { + public HttpRequest body(RequestBody requestBody) { this.requestBody = requestBody; return this; } - public XRequest bodyString(String body) { + public HttpRequest bodyString(String body) { this.requestBody = RequestBody.create(null, body); return this; } - public XRequest bodyJson(Object body) { + public HttpRequest bodyJson(Object body) { return bodyString(JsonUtil.toJson(body)); } - private XRequest(final Request.Builder requestBuilder, UriComponentsBuilder uriBuilder, String httpMethod) { + private HttpRequest(final Request.Builder requestBuilder, UriComponentsBuilder uriBuilder, String httpMethod) { this.requestBuilder = requestBuilder; this.uriBuilder = uriBuilder; this.httpMethod = httpMethod; @@ -167,6 +169,9 @@ public class XRequest { loggingInterceptor.setLevel(level); builder.addInterceptor(loggingInterceptor); } + if (this.authenticator != null) { + builder.authenticator(authenticator); + } if (this.interceptor != null) { builder.addInterceptor(this.interceptor); } @@ -187,83 +192,93 @@ public class XRequest { return builder.build().newCall(request).execute(); } - public XResponse execute() { + public HttpResponse execute() { try { - return new XResponse(internalExecute(httpClient)); + return new HttpResponse(internalExecute(httpClient)); } catch (IOException e) { throw new RuntimeException(e); } } + public HttpRequest baseAuth(String userName, String password) { + this.authenticator = new BaseAuthenticator(userName, password); + return this; + } + //// HTTP header operations - public XRequest addHeader(final String... namesAndValues) { + public HttpRequest addHeader(final Map headers) { + this.requestBuilder.headers(Headers.of(headers)); + return this; + } + + public HttpRequest addHeader(final String... namesAndValues) { Headers headers = Headers.of(namesAndValues); this.requestBuilder.headers(headers); return this; } - public XRequest addHeader(final String name, final String value) { + public HttpRequest addHeader(final String name, final String value) { this.requestBuilder.addHeader(name, value); return this; } - public XRequest setHeader(final String name, final String value) { + public HttpRequest setHeader(final String name, final String value) { this.requestBuilder.header(name, value); return this; } - public XRequest removeHeader(final String name) { + public HttpRequest removeHeader(final String name) { this.requestBuilder.removeHeader(name); return this; } - public XRequest cacheControl(final CacheControl cacheControl) { + public HttpRequest cacheControl(final CacheControl cacheControl) { this.requestBuilder.cacheControl(cacheControl); return this; } - public XRequest userAgent(final String userAgent) { + public HttpRequest userAgent(final String userAgent) { this.userAgent = userAgent; return this; } - public XRequest followRedirects(boolean followRedirects) { + public HttpRequest followRedirects(boolean followRedirects) { this.followRedirects = followRedirects; return this; } - public XRequest log() { + public HttpRequest log() { this.level = HttpLoggingInterceptor.Level.BODY; return this; } - public XRequest log(HttpLoggingInterceptor.Level level) { + public HttpRequest log(HttpLoggingInterceptor.Level level) { this.level = level; return this; } - public XRequest interceptor(Interceptor interceptor) { + public HttpRequest interceptor(Interceptor interceptor) { this.interceptor = interceptor; return this; } //// HTTP connection parameter operations - public XRequest connectTimeout(final Duration timeout) { + public HttpRequest connectTimeout(final Duration timeout) { this.connectTimeout = timeout; return this; } - public XRequest readTimeout(Duration readTimeout) { + public HttpRequest readTimeout(Duration readTimeout) { this.readTimeout = readTimeout; return this; } - public XRequest writeTimeout(Duration writeTimeout) { + public HttpRequest writeTimeout(Duration writeTimeout) { this.writeTimeout = writeTimeout; return this; } - public XRequest viaProxy(final InetSocketAddress address) { + public HttpRequest viaProxy(final InetSocketAddress address) { this.proxy = new Proxy(Proxy.Type.HTTP, address); return this; } @@ -274,6 +289,6 @@ public class XRequest { } public static void setHttpClient(OkHttpClient httpClient) { - XRequest.httpClient = httpClient; + HttpRequest.httpClient = httpClient; } } diff --git a/mica-okhttp/src/main/java/net/dreamlu/http/XResponse.java b/mica-http/src/main/java/net/dreamlu/http/HttpResponse.java similarity index 97% rename from mica-okhttp/src/main/java/net/dreamlu/http/XResponse.java rename to mica-http/src/main/java/net/dreamlu/http/HttpResponse.java index 825481e221b4d5b7c0fac6af87a864fd675dcf1c..828edd1f311730d0a9dbc2fafb0c4752e4896da4 100644 --- a/mica-okhttp/src/main/java/net/dreamlu/http/XResponse.java +++ b/mica-http/src/main/java/net/dreamlu/http/HttpResponse.java @@ -37,11 +37,11 @@ import java.util.Map; * * @author L.cm */ -public class XResponse { +public class HttpResponse { private final Response response; private final ResponseBody body; - XResponse(final Response response) { + HttpResponse(final Response response) { this.response = response; this.body = response.body(); } diff --git a/mica-okhttp/src/main/java/net/dreamlu/http/XMethod.java b/mica-http/src/main/java/net/dreamlu/http/Method.java similarity index 96% rename from mica-okhttp/src/main/java/net/dreamlu/http/XMethod.java rename to mica-http/src/main/java/net/dreamlu/http/Method.java index 6755b18af4e7d0ce35fb452a332502330e4c29de..c45c621fc4695860042db89dc4fe5eb0ec92cffc 100644 --- a/mica-okhttp/src/main/java/net/dreamlu/http/XMethod.java +++ b/mica-http/src/main/java/net/dreamlu/http/Method.java @@ -21,7 +21,7 @@ package net.dreamlu.http; * * @author dream.lu */ -public interface XMethod { +public interface Method { String GET = "GET"; String POST = "POST"; String PATCH = "PATCH"; diff --git a/mica-okhttp/src/main/java/net/dreamlu/http/XFormPartBuilder.java b/mica-http/src/main/java/net/dreamlu/http/MultipartFormBuilder.java similarity index 68% rename from mica-okhttp/src/main/java/net/dreamlu/http/XFormPartBuilder.java rename to mica-http/src/main/java/net/dreamlu/http/MultipartFormBuilder.java index 7dbe1f4146cdaa9e304999bfe24823433a662fe9..3368b09d556db07cc67aae1307afc59c0c1b0841 100644 --- a/mica-okhttp/src/main/java/net/dreamlu/http/XFormPartBuilder.java +++ b/mica-http/src/main/java/net/dreamlu/http/MultipartFormBuilder.java @@ -26,58 +26,58 @@ import java.io.File; * * @author L.cm */ -public class XFormPartBuilder { - private final XRequest request; +public class MultipartFormBuilder { + private final HttpRequest request; private final MultipartBody.Builder formBuilder; - XFormPartBuilder(XRequest request) { + MultipartFormBuilder(HttpRequest request) { this.request = request; this.formBuilder = new MultipartBody.Builder(); } - public XFormPartBuilder add(String name, String value) { + public MultipartFormBuilder add(String name, String value) { this.formBuilder.addFormDataPart(name, value); return this; } - public XFormPartBuilder add(String name, File file) { + public MultipartFormBuilder add(String name, File file) { String fileName = file.getName(); return add(name, fileName, file); } - public XFormPartBuilder add(String name, @Nullable String filename, File file) { + public MultipartFormBuilder add(String name, @Nullable String filename, File file) { RequestBody fileBody = RequestBody.create(null, file); return add(name, filename, fileBody); } - public XFormPartBuilder add(String name, @Nullable String filename, RequestBody fileBody) { + public MultipartFormBuilder add(String name, @Nullable String filename, RequestBody fileBody) { this.formBuilder.addFormDataPart(name, filename, fileBody); return this; } - public XFormPartBuilder add(RequestBody body) { + public MultipartFormBuilder add(RequestBody body) { this.formBuilder.addPart(body); return this; } - public XFormPartBuilder add(@Nullable Headers headers, RequestBody body) { + public MultipartFormBuilder add(@Nullable Headers headers, RequestBody body) { this.formBuilder.addPart(headers, body); return this; } - public XFormPartBuilder add(MultipartBody.Part part) { + public MultipartFormBuilder add(MultipartBody.Part part) { this.formBuilder.addPart(part); return this; } - public XRequest build() { + public HttpRequest build() { formBuilder.setType(MultipartBody.FORM); MultipartBody formBody = formBuilder.build(); - this.request.formPart(formBody); + this.request.multipartForm(formBody); return this.request; } - public XResponse execute() { + public HttpResponse execute() { return this.build().execute(); } } diff --git a/mica-okhttp/src/main/java/net/dreamlu/http/Slf4jLogger.java b/mica-http/src/main/java/net/dreamlu/http/Slf4jLogger.java similarity index 100% rename from mica-okhttp/src/main/java/net/dreamlu/http/Slf4jLogger.java rename to mica-http/src/main/java/net/dreamlu/http/Slf4jLogger.java diff --git a/mica-okhttp/src/test/java/net/dreamlu/XRequests.java b/mica-http/src/test/java/net/dreamlu/HttpRequestDemo.java similarity index 83% rename from mica-okhttp/src/test/java/net/dreamlu/XRequests.java rename to mica-http/src/test/java/net/dreamlu/HttpRequestDemo.java index 87cc8dfb622ec153a406203beca147cab2efc014..a015204dea49905f0a78f0617de6c3f974b0e527 100644 --- a/mica-okhttp/src/test/java/net/dreamlu/XRequests.java +++ b/mica-http/src/test/java/net/dreamlu/HttpRequestDemo.java @@ -17,19 +17,19 @@ package net.dreamlu; import okhttp3.logging.HttpLoggingInterceptor; -import net.dreamlu.http.XRequest; -import net.dreamlu.http.XResponse; +import net.dreamlu.http.HttpRequest; +import net.dreamlu.http.HttpResponse; import java.time.Duration; /** * This example of mica http */ -public class XRequests { +public class HttpRequestDemo { public static void main(String[] args) { // Execute a GET with timeout settings and return response content as String. - XRequest.get("https://www.baidu.com/") + HttpRequest.get("https://www.baidu.com/") .connectTimeout(Duration.ofSeconds(1000)) .log() .query("test", "a", "b", "c") @@ -40,7 +40,7 @@ public class XRequests { // Execute a POST with the 'expect-continue' handshake, using HTTP/1.1, // containing a request body as String and return response content as byte array. - XRequest.post("https://www.baidu.com/do-stuff") + HttpRequest.post("https://www.baidu.com/do-stuff") .log(HttpLoggingInterceptor.Level.BASIC) .bodyString("Important stuff") .formBuilder() @@ -49,11 +49,11 @@ public class XRequests { // Execute a POST with a custom header through the proxy containing a request body // as an HTML form and save the result to the file - XResponse xResponse = XRequest.post("https://www.baidu.com/some-form") + HttpResponse httpResponse = HttpRequest.post("https://www.baidu.com/some-form") .log(HttpLoggingInterceptor.Level.HEADERS) .addHeader("X-Custom-header", "stuff") .execute(); - System.out.println(xResponse); + System.out.println(httpResponse); } } diff --git a/settings.gradle b/settings.gradle index e85a853991c679db6fd983bfd0882fd148aeca4d..145454cda07e2590db10888609c4c57ce71eb22e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ rootProject.name = "mica" include "mica-bom" include "mica-core" -include "mica-okhttp" +include "mica-http" include "mica-launcher" include "mica-log4j2" include "mica-boot"