# HttpNet项目结构如下
![HttpNet项目结构](http://git.oschina.net/uploads/images/2016/0919/132807_3e935005_494015.png "HttpNet项目结构")
HttpNet网络请求框架基于HttpUrlConnection,采用Client + Request + Call的请求模型,支持HTTPS,支持同步和异步方法,支持Rxjava,支持上传和下载监听,同步请求配合RxJava十分方便实现线程切换
如果用于Android开发,请使用[Elegant](http://git.oschina.net/huanghaibin_dev/Elegant)体验新的Android开发高潮,它的网络请求模块基于HttpNet,采用动态代理 + 构建的思想,致敬Retrofit!
## gradle
```java
compile 'com.haibin:httpnet:1.1.5'
```
## RxJava断点下载
```java
final File rangeFile = new File(Environment.getExternalStorageDirectory().getPath() + "/cnblogs.apk");
final long readySize = rangeFile.exists() ? rangeFile.length() : 0;
Headers.Builder headers = new Headers.Builder()
.addHeader("Range", "bytes=" + readySize + "-");
Request request = new Request.Builder()
.url("http://f1.market.xiaomi.com/download/
AppStore/0117653278abecee8762883a940e129e9d242ae7d/com.huanghaibin_dev.cnblogs.apk")
.headers(headers)
.build();
callDownload = client.newCall(request);//调用callDownload.cancel();取消请求实现暂停,再次请求即可从断点位置继续下载
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
try {
Response response = callDownload.execute();
InputStream is = response.toStream();
RandomAccessFile randomAccessFile = new RandomAccessFile(rangeFile, "rw");
randomAccessFile.seek(readySize);
int length = response.getContentLength();
length += readySize;
int p = (int) readySize;
int bytes;
byte[] buffer = new byte[1024];
while ((bytes = is.read(buffer)) != -1) {
randomAccessFile.write(buffer, 0, bytes);
p += bytes;
e.onNext(String.valueOf((p / (float) length) * 100));
}
response.close();
} catch (Exception error) {
error.printStackTrace();
e.onError(error);
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
text.setText(value);
float f = Float.parseFloat(value);
progressBar.setProgress((int) f);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
```
## RxJava同步上传监听:
```java
final Request request = new Request.Builder()
.url("http://upload.cnblogs.com/ImageUploader/TemporaryAvatarUpload")
.method("POST")
.params(new RequestParams()
.putFile("qqfile", "/storage/emulated/0/DCIM/Camera/339718150.jpeg"))
.headers(new Headers.Builder().addHeader("Cookie", "CNZZDATA1259029673=2072545293-1479795067-null%7C1479795067; lhb_smart_1=1; __utma=226521935.1789795872.1480996255.1480996255.1480996255.1; __utmz=226521935.1480996255.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; .CNBlogsCookie=A6783E37E1040979421EC4A57A2FEFBB74B65BB51C7345AC99B64A7065293F59A79C6830C60D71629E8D28A332436E23CD40968EB58AA830CBD0F0733438F9A7627C074DB0462C2576D206D3752E640871E8CB23D1A50B0A9962C158466EE81425B1E516; _gat=1; _ga=GA1.2.1789795872.1480996255"))
.build();
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(final ObservableEmitter<String> e) throws Exception {
client.newCall(request)
.intercept(new InterceptListener() {
@Override
public void onProgress(int index, long currentLength, long totalLength) {
Log.e("file", index + " -- " + " -- " + currentLength + " -- " + totalLength);
e.onNext(index + " -- " + " -- " + currentLength + " -- " + totalLength);
}
})
.execute();
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String response) throws Exception {
Log.e("is", response);
text.setText(response);
}
});
```
## RxJava同步下载监听:
```java
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
callDownload = client.newCall("http://f3.market.xiaomi.com/download/AppStore/0b3f6b4e06ff14b61065972a96149da822c86ad40/com.eg.android.AlipayGphone.apk");
Response response = callDownload.execute();
InputStream is = response.toStream();
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/alipay.apk");
FileOutputStream os = new FileOutputStream(file);
int length = response.getContentLength();
int p = 0;
int bytes;
byte[] buffer = new byte[1024];
while ((bytes = is.read(buffer)) != -1) {
os.write(buffer, 0, bytes);
p += bytes;
e.onNext(String.valueOf((p / (float) length) * 100));
}
response.close();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
text.setText(s);
float f = Float.parseFloat(s);
progressBar.setProgress((int) f);
}
});
```
### 默认支持Https CA认证证书,如果使用自签名证书,在执行请求之前使用下面3种API导入证书即可
```java
client.setSslSocketFactory(getAssets().open("12306.cer"));//证书文件输入流
client.setSslSocketFactory("filepath/12306.cer");//证书路径
client.setSslSocketFactoryAsString("cerValue");//证书文本
/*注意,添加多个证书只能调用该方法一次,可以使用如下方式添加多个证书,该客户端导入证书之后将不能访问其它没有导入https的链接,
重新创建一个HttpNetClient反问新的https即可*/
InputStream is12306 = getAssets().open("12306.cer");
InputStream isGoogle = getAssets().open("google.cer");
client.setSslSocketFactory(is12306 , isGoogle );
Request request = new Request.Builder()
.encode("UTF-8")
.method("GET")
.timeout(13000)
.proxy("192.168.1.1",80) //支持HTTP代理
没有合适的资源?快使用搜索试试~ 我知道了~
一个基于Java原生的Http客户端。HttpNet网络请求框架基于HttpUrlConnection.zip
共81个文件
java:29个
xml:18个
png:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 194 浏览量
2024-03-24
10:51:37
上传
评论
收藏 146KB ZIP 举报
温馨提示
一个基于Java原生的Http客户端。HttpNet网络请求框架基于HttpUrlConnection
资源推荐
资源详情
资源评论
收起资源包目录
一个基于Java原生的Http客户端。HttpNet网络请求框架基于HttpUrlConnection.zip (81个子文件)
java0323
gradle.properties 2KB
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 231B
httpnet
src
androidTest
java
com
haibin
httpnet
ExampleInstrumentedTest.java 745B
test
java
com
haibin
httpnet
ExampleUnitTest.java 396B
main
assets
content_type.json 11KB
java
com
haibin
httpnet
builder
Headers.java 2KB
RequestParams.java 3KB
Request.java 5KB
HttpNetClient.java 3KB
core
Dispatcher.java 1KB
call
Call.java 1KB
InterceptListener.java 1KB
CallBack.java 1KB
RealCall.java 2KB
AsyncCall.java 2KB
ContentTypeFactory.java 2KB
connection
HttpsConnection.java 4KB
HttpConnection.java 4KB
Connection.java 5KB
SSLManager.java 8KB
io
FormContent.java 2KB
MultiPartContent.java 5KB
IO.java 1KB
JsonContent.java 2KB
HttpContent.java 2KB
Response.java 3KB
res
values
strings.xml 70B
AndroidManifest.xml 246B
proguard-rules.pro 645B
build.gradle 1KB
.gitignore 7B
app
src
androidTest
java
com
haibin
httpnetproject
ExampleInstrumentedTest.java 754B
test
java
com
haibin
httpnetproject
ExampleUnitTest.java 403B
main
assets
app.bks 872B
github.cer 2KB
12306.cer 693B
client.crt 788B
root.key 958B
root.csr 814B
ccc.key 958B
test.bks 799B
root.crt 1KB
google.cer 1KB
java
com
haibin
httpnetproject
LeakSingle.java 817B
HomeActivity.java 1KB
AppContext.java 240B
MainActivity.java 16KB
res
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher.png 3KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
xml
network_security_config.xml 391B
values-w820dp
dimens.xml 358B
values
dimens.xml 211B
colors.xml 208B
strings.xml 77B
styles.xml 383B
layout
activity_main.xml 2KB
activity_home.xml 736B
raw
root.crt 1KB
AndroidManifest.xml 1003B
proguard-rules.pro 645B
build.gradle 1KB
.gitignore 7B
LICENSE 10KB
gradlew.bat 2KB
build.gradle 641B
.idea
runConfigurations.xml 564B
vcs.xml 167B
misc.xml 2KB
compiler.xml 686B
modules.xml 478B
gradle.xml 679B
copyright
profiles_settings.xml 74B
settings.gradle 27B
gradlew 5KB
.gitignore 521B
script
gradle-jcenter-push.gradle 4KB
README.md 11KB
共 81 条
- 1
资源评论
Kwan的解忧杂货铺
- 粉丝: 1w+
- 资源: 3628
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功