Проект HttpNet: структура и особенности
HttpNet — это сетевая инфраструктура для разработки, основанная на HttpUrlConnection. Она использует модель запроса Client + Request + Call и поддерживает HTTPS CA аутентификацию или самоподписанные сертификаты.
Особенности:
— Поддержка синхронных и асинхронных методов. — Совместимость с Rxjava. — Возможность отслеживать загрузку и выгрузку данных. — Синхронные запросы легко сочетаются с RxJava для переключения потоков.
Использование в Android-разработке
Для Android-разработки рекомендуется использовать Elegant — опытную среду разработки на основе HttpNet. Её сетевой модуль основан на динамическом прокси и идее построения, что делает её похожей на Retrofit!
Gradle
compile 'com.haibin:httpnet:1.1.5'
Пример использования RxJava для загрузки файла с точки останова
В этом примере используется RxJava для реализации загрузки файла с точкой останова. Файл загружается с сервера и сохраняется на устройстве.
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 и показывает прогресс загрузки в процентах.
Синхронная загрузка с использованием RxJava
Пример кода для синхронной загрузки файла с помощью RxJava. В этом коде файл загружается на сервер с использованием метода POST.
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 {
...
``` **Синхронная загрузка с RxJava и мониторинг процесса:**
```java
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:
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);
}
});
По умолчанию поддерживается аутентификация CA для HTTPS. Если используется самозаверяющий сертификат, то перед выполнением запроса необходимо использовать один из следующих трёх API для импорта сертификата:
client.setSslSocketFactory(getAssets().open("12306.cer"));//证书文件输入流
client.setSslSocketFactory("filepath/12306.cer");//证书路径
client.setSslSocketFactoryAsString("cerValue");//сертификат в виде строки
Обратите внимание, что после добавления сертификата клиент не сможет получить доступ к другим ссылкам, которые не используют HTTPS. Можно создать новый экземпляр HttpNetClient для доступа к таким ссылкам.
Также можно добавить несколько сертификатов, используя следующий код:
InputStream is12306 = getAssets().open("12306.cer");
InputStream isGoogle = getAssets().open("google.cer");
client.setSslSocketFactory(is12306 , isGoogle );
Пример GET-запроса:
Request request = new Request.Builder()
.encode("UTF-8")
.method("GET")
.timeout(13000)
.proxy("192.168.1.1",80) //поддержка HTTP-прокси
.url("https://kyfw.12306.cn/otn/")
.build();
Пример POST-запроса с параметрами:
RequestParams params = new RequestParams()
.put("userName","oscer")
.putFile("fileName","file")
.put("pwd","oschina");
Request request = new Request.Builder()
.encode("UTF-8")
.method("POST")
.params(params)
.timeout(13000)
.url("http://www.oschina.net")
.build();
Пример JSON-запроса:
Request request = new Request.Builder()
.encode("UTF-8")
.method("POST")
.content(new
``` ## Выполнение запроса:
```java
HttpNetClient client = new HttpNetClient();
client.setProxy("192.168.1.1",80);//Вы также можете включить глобальный прокси для этого клиента
client.newCall(request)
//Если используется метод загрузки файла, здесь можно включить мониторинг прогресса загрузки
.intercept(new InterceptListener() {
@Override
public void onProgress(final int index, final long currentLength, final long totalLength) {
Log.e("Текущий прогресс", " -- " + ((float) currentLength / totalLength) * 100);
}
})
.execute(new Callback() {
@Override
public void onResponse(Response response) {
String body = response.getBody();
InputStream is = response.toStream();//Если используется загрузка, здесь можно отслеживать прогресс загрузки
}
@Override
public void onFailure(Exception e) {
Log.e("onFailure", " onFailure " + e.getMessage());
}
});
Copyright (C) 2013 huanghaibin_dev huanghaibin_dev@163.com
Лицензия Apache, версия 2.0 («Лицензия»);
Вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
Вы можете получить копию Лицензии по адресу:
Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по Лицензии, распространяется на условиях «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых.
См. Лицензию для конкретного языка, регулирующего разрешения и ограничения в рамках Лицензии.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )