diff --git a/build.gradle b/build.gradle index 03bced9..aff4f41 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575..13372ae 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/litehttp/src/main/java/com/litesuits/http/impl/huc/HttpUrlClient.java b/litehttp/src/main/java/com/litesuits/http/impl/huc/HttpUrlClient.java index 0addab4..ca59fe3 100644 --- a/litehttp/src/main/java/com/litesuits/http/impl/huc/HttpUrlClient.java +++ b/litehttp/src/main/java/com/litesuits/http/impl/huc/HttpUrlClient.java @@ -1,13 +1,18 @@ package com.litesuits.http.impl.huc; import android.util.Log; + import com.litesuits.http.HttpClient; import com.litesuits.http.HttpConfig; import com.litesuits.http.data.Charsets; import com.litesuits.http.data.Consts; import com.litesuits.http.data.HttpStatus; import com.litesuits.http.data.NameValuePair; -import com.litesuits.http.exception.*; +import com.litesuits.http.exception.HttpClientException; +import com.litesuits.http.exception.HttpNetException; +import com.litesuits.http.exception.HttpServerException; +import com.litesuits.http.exception.NetException; +import com.litesuits.http.exception.ServerException; import com.litesuits.http.listener.StatisticsListener; import com.litesuits.http.log.HttpLog; import com.litesuits.http.parser.DataParser; @@ -16,12 +21,15 @@ import com.litesuits.http.request.param.HttpMethods; import com.litesuits.http.response.InternalResponse; -import javax.net.ssl.*; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import java.io.OutputStream; -import java.net.*; +import java.net.HttpURLConnection; +import java.net.SocketTimeoutException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; @@ -29,6 +37,14 @@ import java.util.Map; import java.util.Set; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + /** * @author 氢一 @http://def.so * @date 2016-04-03 @@ -69,6 +85,7 @@ public void connect(AbstractRequest request, InternalResponse response) StatisticsListener statistic = response.getStatistics(); try { // 0. build URL + //Todo 这里增加post的情况就把param放到消息体里 URL url = new URL(request.createFullUri()); // 1. open connection and set SSL factory and hostname verifier. @@ -254,6 +271,9 @@ private void writeDataIfNecessary(HttpURLConnection connection, AbstractRequest< HttpMethods method = request.getMethod(); if (method == HttpMethods.Post || method == HttpMethods.Put || method == HttpMethods.Patch) { HttpBody body = request.getHttpBody(); + if(body==null){ + body=request.createHttpBody(); + } if (body != null) { connection.setDoOutput(true); connection.setRequestProperty(Consts.CONTENT_TYPE, body.getContentType()); @@ -270,8 +290,8 @@ public static void trustAllCertificate() { // Create a trust manager that does not validate certificate chains // Android use X509 cert TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; } public void checkClientTrusted(X509Certificate[] chain, diff --git a/litehttp/src/main/java/com/litesuits/http/request/AbstractRequest.java b/litehttp/src/main/java/com/litesuits/http/request/AbstractRequest.java index 7e2e5f8..650fb4f 100644 --- a/litehttp/src/main/java/com/litesuits/http/request/AbstractRequest.java +++ b/litehttp/src/main/java/com/litesuits/http/request/AbstractRequest.java @@ -1,7 +1,18 @@ package com.litesuits.http.request; import android.net.Uri; -import com.litesuits.http.annotation.*; + +import com.litesuits.http.annotation.HttpBaseUrl; +import com.litesuits.http.annotation.HttpCacheExpire; +import com.litesuits.http.annotation.HttpCacheKey; +import com.litesuits.http.annotation.HttpCacheMode; +import com.litesuits.http.annotation.HttpCharSet; +import com.litesuits.http.annotation.HttpID; +import com.litesuits.http.annotation.HttpMaxRedirect; +import com.litesuits.http.annotation.HttpMaxRetry; +import com.litesuits.http.annotation.HttpMethod; +import com.litesuits.http.annotation.HttpTag; +import com.litesuits.http.annotation.HttpUri; import com.litesuits.http.data.Consts; import com.litesuits.http.data.NameValuePair; import com.litesuits.http.exception.ClientException; @@ -14,7 +25,11 @@ import com.litesuits.http.request.content.StringBody; import com.litesuits.http.request.content.UrlEncodedFormBody; import com.litesuits.http.request.content.multi.MultipartBody; -import com.litesuits.http.request.param.*; +import com.litesuits.http.request.param.CacheMode; +import com.litesuits.http.request.param.HttpMethods; +import com.litesuits.http.request.param.HttpParamModel; +import com.litesuits.http.request.param.HttpReplace; +import com.litesuits.http.request.param.HttpRichParamModel; import com.litesuits.http.request.query.JsonQueryBuilder; import com.litesuits.http.request.query.ModelQueryBuilder; import com.litesuits.http.utils.HexUtil; @@ -517,7 +532,10 @@ public LinkedHashMap getBasicParams() if (paramModel instanceof HttpRichParamModel && !((HttpRichParamModel) paramModel).isFieldsAttachToUrl()) { return map; } - map.putAll(getQueryBuilder().buildPrimaryMap(paramModel)); + //Todo 如果是post就放到消息体里 + if(method== HttpMethods.Get){ + map.putAll(getQueryBuilder().buildPrimaryMap(paramModel)); + } } return map; } @@ -560,7 +578,20 @@ public void cancel() { this.cancel.set(true); } - + //TODO 对post特殊处理 + public HttpBody createHttpBody() { + if(httpBody!=null){ + return httpBody; + } + try { + if(getQueryBuilder()!=null){ + return getQueryBuilder().buildHttpbody(paramModel); + } + } catch (Exception e) { + e.printStackTrace(); + } + return httpBody; + } public String createFullUri() throws HttpClientException { if (uri == null || !uri.startsWith(Consts.SCHEME_HTTP)) { if (baseUrl == null) { diff --git a/litehttp/src/main/java/com/litesuits/http/request/query/ModelQueryBuilder.java b/litehttp/src/main/java/com/litesuits/http/request/query/ModelQueryBuilder.java index e9da2b7..63a0a71 100644 --- a/litehttp/src/main/java/com/litesuits/http/request/query/ModelQueryBuilder.java +++ b/litehttp/src/main/java/com/litesuits/http/request/query/ModelQueryBuilder.java @@ -3,9 +3,18 @@ import com.litesuits.http.data.Charsets; import com.litesuits.http.data.Consts; import com.litesuits.http.data.NameValuePair; -import com.litesuits.http.request.param.*; +import com.litesuits.http.log.HttpLog; +import com.litesuits.http.request.content.multi.FilePart; +import com.litesuits.http.request.content.multi.MultipartBody; +import com.litesuits.http.request.content.multi.StringPart; +import com.litesuits.http.request.param.HttpCustomParam; import com.litesuits.http.request.param.HttpCustomParam.CustomValueBuilder; +import com.litesuits.http.request.param.HttpParam; +import com.litesuits.http.request.param.HttpParamModel; +import com.litesuits.http.request.param.HttpRichParamModel; +import com.litesuits.http.request.param.NonHttpParam; +import java.io.File; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -87,7 +96,68 @@ public LinkedHashMap buildPrimaryMap(HttpParamModel model) throw } return map; } - + public MultipartBody buildHttpbody(HttpParamModel model) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException, UnsupportedEncodingException { + if (model == null) { return null; } + // find all field. + ArrayList fieldList = getAllDeclaredFields(model.getClass()); +// LinkedHashMap map = new LinkedHashMap(fieldList.size()); + // put all field and its value into map + MultipartBody body = new MultipartBody(); + StringBuffer stringBuffer=new StringBuffer(); + for (int i = 0, size = fieldList.size(); i < size; i++) { + Field f = fieldList.get(i); + f.setAccessible(true); + HttpParam keyAnno = f.getAnnotation(HttpParam.class); + String key = keyAnno != null ? keyAnno.value() : f.getName(); + Object value = f.get(model); + if (value != null) { + stringBuffer.append(key).append("="); + // value is primitive + if (isPrimitive(value)) { + body.addPart(new StringPart(key, value.toString())); + stringBuffer.append(value.toString()).append("&"); + } else if (value instanceof HttpCustomParam) { + Method methods[] = HttpCustomParam.class.getDeclaredMethods(); + for (Method m : methods) { + // invoke the method which has specified Annotation + if (m.getAnnotation(CustomValueBuilder.class) != null) { + m.setAccessible(true); + Object v = m.invoke(value); + if (v != null&&v instanceof File) { +// map.put(key, v.toString()); +// body.addPart(new StringPart("key1", "hello")); +// body.addPart(new StringPart("key2", "很高兴见到你", "utf-8", null)); +// body.addPart(new BytesPart("key3", new byte[]{1, 2, 3})); +// body.addPart(new FilePart("pic", new File("/sdcard/aaa.jpg"), "image/jpeg")); + //Todo 这里应该可以配置mimetype + File file= (File) v; + body.addPart(new FilePart(key, file)); + stringBuffer.append(file.getAbsolutePath()).append("&"); +// body.addPart(new InputStreamPart("litehttp", fis, "user.txt", "text/plain")); +// postRequest.setHttpBody(body); + } + break; + } + } + } + //Todo 这里先写死了 + else if (value instanceof File) { + File file= (File) value; + body.addPart(new FilePart(key, file)); + stringBuffer.append(file.getAbsolutePath()).append("&"); + }else { + CharSequence cs = buildSencondaryValue(value); + if (cs != null) { + body.addPart(new StringPart(key, cs.toString())); + stringBuffer.append(cs.toString()).append("&"); + } + } + } + } + HttpLog.d("LiteHttp post",stringBuffer.toString()); + return body; + } protected abstract CharSequence buildSencondaryValue(Object model); /********************* utils method **************************/