HarmonyHttpClient
Harmony — это используемая на платформе Harmony сетевая структура Http, которая включает в себя реализацию HttpNet на чистом Java. Она похожа на okhttp и поддерживает синхронные и асинхронные запросы. Также существует версия Harmony Retrofit, аналогичная версии для Android. Она позволяет использовать аннотации и автоматически анализировать JSON.
RequestParams params = new RequestParams()
.put("userName","oscer")
.put("pwd","oschina");
Request request = new Request.Builder().encode("UTF-8")
.method("GET")
.timeout(13000)
.url("http://www.oschina.net")
.build();
//Запрос параметров
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();
Request request = new Request.Builder()
.encode("UTF-8")
.method("POST")
.content(new JsonContent("json")
.timeout(13000)
.url("http://www.oschina.net")
.build();
//Создание клиента HttpNetClient, здесь можно выполнить глобальную статическую окончательную настройку
HttpNetClient client = new HttpNetClient();
client.setProxy("192.168.1.1",80);//Вы также можете включить этот клиент глобального прокси
client.addInterceptor(new Interceptor() {
/* Перехватчик всегда будет выполняться до этого шага перед выполнением запроса, будь то синхронный или асинхронный.
* Поэтому здесь можно динамически добавлять глобальные файлы cookie или другие заголовки.
* Продвинутое использование: Если вы хотите зашифровать все интерфейсы формы для всех интерфейсов, вы также можете сделать это здесь.
*/
@Override
public void intercept(Request request) {
Log.e("Перехватчик текущего потока:" + Thread.currentThread().getName() + " -- " + request.url());
}
});
//Выполнение асинхронного запроса
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();//getBody() и toStream() являются взаимоисключающими
InputStream is = response.toStream();//Если вы используете загрузку, вы можете отслеживать ход загрузки здесь
}
@Override
public void onFailure(Exception e) {
Log.e("onFailure " + e.getMessage());
}
});
// Вы также можете выполнять синхронные запросы в дочерних потоках. Это лучший способ, если вам нужно последовательно запрашивать несколько интерфейсов.
try {
Response response = client.newCall(request).execute();
String body = response.getBody();
}catch (Exception e){
e.printStackTrace();
}
// Создание интерфейса запроса java, реализация динамического прокси + аннотация, сервер возвращает что-то, Call<сервер возвращает json соответствующий Java bean>
public interface LoginService {
//Обычный POST, имя метода добавляет аннотацию метода POST, GET, DELETE, Header и т.д., параметры метода добавляют аннотацию формы
@Headers({"Cookie:cid=adcdefg;"})//Статический заголовок
@POST("api/users/login")
Call<BaseModel<User>> login(@Form("email") String email,
@Form("pwd") String pwd,
@Form("versionNum") int versionNum,
@Form("dataFrom") int dataFrom);
// Загрузка файла
@POST("action/apiv2/user_edit_portrait")
@Headers("Cookie:xxx=hbbb;")//аннотация загрузки файла
Call<String> postAvatar(@File("portrait") String file);
//JSON POST
@POST("action/apiv2/user_edit_portrait")
@Headers("Cookie:xxx=hbbb;")
Call<String> postJson(@Json String file);//Если это JSON POST, вы можете использовать его таким образом
//PATCH
@PATCH("mobile/user/{uid}/online")//Динамическое изменение пути URL
Call<ResultBean<String>> handUp(@Path("uid") long uid);
}
``` Выполнение запроса
```java
public static final String API = "http://www.oschina.net/";
public static Retrofit retrofit = new Retrofit();
retrofit.registerApi(API);//注册api
//进阶使用,假设服务器返回来的 json 内容是 aes 加密的,那么可以添加转化器,拦截响应,aes 解密后再返回,此方法一定在子线程执行,直接执行耗时操作
retrofit.setConverterFactory(new ConverterFactory() {
@Override
public void convert(com.haibin.retrofit.Response response) {
response.setBodyString("{json}");//拦截响应数据,修改内容,如 aes 解密后再返回
Log.e("响应转换器当前线程: " + Thread.currentThread().getName());
}
});
//执行异步请求,异步请求可以直接在 UI 线程执行
retrofit.from(LoginService.class)
.login("xxx@qq.com", "123456", 2, 2);
.withHeaders(Headers...)//动态添加某些 Header
.execute(new Callback<BaseModel<User>>() {
@Override
public void onResponse(Response<BaseModel<User>> response) {
//回调是切换在 UI 线程,可直接更新界面,自动解析 body,就是 BaseModel<User>,需要判断 body 为不为 null
}
@Override
public void onFailure(Exception e) {
}
});
//当然也支持同步请求,顺序请求 N 个接口的最佳方法,解决逻辑嵌套,这里只能在子线程执行
Response<BaseModel<User>> response = retrofit.from(LoginService.class)
.login("xxx@qq.com", "123456", 2, 2);
.withHeaders(Headers...)
.execute();
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )