From 2414a8291f3574e4c1477dcadad811ebcc5c4f8a Mon Sep 17 00:00:00 2001 From: "tiger.zhou" Date: Wed, 10 Aug 2016 08:29:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9paramModel=E4=B8=BApost=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=97=B6=E5=8F=82=E6=95=B0=E9=BB=98=E8=AE=A4=E6=94=BE?= =?UTF-8?q?=E5=88=B0=E6=B6=88=E6=81=AF=E4=BD=93=E9=87=8C=E8=80=8C=E9=9D=9E?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E5=88=B0url=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 53637 -> 53636 bytes .../http/impl/huc/HttpUrlClient.java | 30 +++++-- .../http/request/AbstractRequest.java | 39 ++++++++- .../http/request/query/ModelQueryBuilder.java | 74 +++++++++++++++++- 5 files changed, 133 insertions(+), 12 deletions(-) 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 05ef575b0cd0173fc735f2857ce4bd594ce4f6bd..13372aef5e24af05341d49695ee84e5f9b594659 100644 GIT binary patch delta 1915 zcmZWp3rtg27(Tr%g+V)>*5Oroilt5{MV$^`3?}1IR^*{Ur+_d!WoV`YHzrWTU>FAF zh|y>=kq#EeEYQLRf+_MW6iQ`=88e3lP!}{pR5nNE&i${IRc~_h{pY*?_rK0L_h=Qj zsER98M00ue2-(>oNkhd+p`VaI#7M=N%^MIxi6=M4ySYjvcT4V{Avt#hJ^k+kR@vuIp}i zC|R>=Ufe#X;+Bx_{yD8wSMN?(*|`7PX5Mt|@_pj!@a#{Whj{_{{N(B7$)a`F&$~a; zncu6KOdArv@0G7EJfkW8yW{B7ocWr(C3P;-zg`;dRN>${^`YJIPkcD#U*+-lPCUuq z7^HKYU-Ynk?1Qt7F5;b|4^|I(%N!DVsA3knQRH zhHvh$4KU9Oo^!yMDZIftn@Y?qQ&svSn}t(;<+$Ldkm7_MpJ!Kcz%E*DB^ z($^h0Lm_mDZz-jqkB@1SNIR;z$cm0Oe8OfJ*M_oc|6hh!X0|zj^@(rATo+~@pWQx; zHj!C`lh*^`ShE*)*Sm$jdDLWzH;>x5)dAyBZroSb5NGLESl>ge(XV9AJHDq61axm- z1-Q9=Js@t61srSN2bgqC4p@C{D~BBA{zG8+TXtE?677V_v&#-aX+$W;k=#C#MYZ$psP>1)|hU9V^gw6^P^0PP))TuJDIfh9O$r zN-J3ro*H~Pe-lmRG{Cs(8XRBs7iJbs{7FXj4avCHN;;y2%12B~AuVT!=FoW2&_^(q z<@1z delta 1838 zcmZWpdrVVT7(cz`Q65DLqJ}XU z9KpfZA`x1%7A{oS z(vw_%l9X#^jS!EAZ2aYwd@-LuOo2}96^0O!S8hrXemI#wmCr$ohA;i(m1=h`14bW! zrxFIRFK3uR4WBBYfG9D$55z9>Mj$joo`VH2tL$#EjD#5z2XYRSsWwxsg-B#W41nePuJks=cDqn#U5?0gea zClmdXC4os2$%Vjxi-Ex@d0+DFIMyz8`HsSSnN8y3!rxWS-m1~Yaq)dczGL-RwPH+l z+obdf;`j5hl2v`guPgrg6ZidBayulpQM+g31j;?nE5oHNR8)=AcAHR_7^U~Js+@nG zJX~#cvB+SQ-VW}bZHtyhsq1-EjDSwW6b* z>q~d|s$b+z=0*yCbXgy=%JZn#wE3CV7KO)WiF9U4z&>$}(X3&gSo3T4w%ix#V{v&w zKTNAWh>+E3l*3D`4gcX&R+lRU)gTJ5PePzFj@X ztqYpT8#xzRQy=f`ck}s;#17f)|1OzSig%~I!zHLur5&M|1rAU=0AhK@91t2&)&q87 zlZ`oW)Q}_M!J?y3#D&GZ-632%rg0v7IzOs1N2r#MIVFxbufj$nD>`KkM$-pgu==OP zgOLOqa{q$VnBa>_IToFvT(xjd$6_4Rwnd z9DQ?|%jQyfc9K0hcz!z@Z&VY`+W1`RXPKE+IR$~ETX@exxd?SxAru0ED|*ba?SP}^ zr?wcbJ(HU*%y%@J%t93Ti4aa0aK|oMVfdTFwnqNuu$hh+hZ1rZ9wOeQU2Xaj@fmF} zGx2y#`!1kM`x?OH_Kkp5?J~fT_AdZauOiTz3a6&z|3pO zfLE?b0j;jHc8cpMu)lmg70_PCx=q)83VVYt{>aJlWP}ZF^<&cG^ zdVO(Hr-z7%_opZS?-&k3QZg$6X53U?0u5*c;`EQ*6nw7V(wo3+5fsv-1i%6nwSXN|< zTXn3oKIh{;HOWjxhH34*j$pI$FRV1ifYeB&4tuKvg)8eetM0>6A^ zDd?psotoTC=)$e+A=LiUBt8Fys#>(?3ce=|`Pt(2UY6p?-dDZsqp7dXLqpD+SuQznns#5lT*^dJ=T^z7xBKH){nX5}3mKM-iKQ_FDw0jC(TDgXcg 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 **************************/