Coder Social home page Coder Social logo

kalle's Introduction

Kalle

Logo

Android platform's Http client.

  • Form submissions, such as text form and file form
  • Custom RequestBody, such as files, json and xml
  • Support SSL, can customize the certificate
  • Multiple cache modes, using AES to encrypt cached data
  • Manage cookies like browsers automatically
  • Cancel the request at any time
  • Global converter, obtain JavaBean from server
  • We can choose URLConnection or OkHttp handle socket
Kalle.get("http://www.example.com/user")
    .param("uid", "123")
    .perform(new SimpleCallback<User>(this) {
        @Override
        public void onResponse(SimpleResponse<User, String> response) {
           if(response.isSucceed()) {
              User user = respon.succeed();
           } else {
              Toast.show(response.failed());
           }
        }
    });

For documentation and additional information see the website.

Download

Kalle uses URLConnection handle socket by default, add this dependency using Gradle:

implementation 'com.yanzhenjie:kalle:0.1.7'

If you want to use okhttp handle socket, add this dependency using Gradle:

implementation 'com.yanzhenjie:okalle:0.1.7'

Kalle requires at minimum Android 2.3(Api level 9).

Contributing

Before submitting pull requests, contributors must abide by the agreement .

License

Copyright 2019 Zhenjie Yan

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

kalle's People

Contributors

yanzhenjie avatar zj565061763 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kalle's Issues

用手机4G流量上传文件报错WriteException

List binaries = new ArrayList<>(); // 文件list。

    for (int i = 0; i < result.size(); i++) {
        FileBinary binary = new FileBinary(new File(result.get(i).getPath()));
        binaries.add(binary);
    }

    FormBody formBody = FormBody.newBuilder()
            //.param("from", "Android")
            .param("docType", fileType)
            .binaries("file",binaries)
            .build();
    formBody.onProgress(progressBar);

    Kalle.post(API.getFILL_UPLOAD())
            .tag(System.currentTimeMillis())
            .body(formBody)
            .path(system)
            .readTimeout(10,TimeUnit.MINUTES)
            .connectTimeout(10,TimeUnit.HOURS)
            .addHeader("enctype", Headers.VALUE_APPLICATION_FORM)
            //.setHeader(Headers.KEY_CONTENT_TYPE, Headers.VALUE_APPLICATION_FORM + ";boundary=" + UUID.randomUUID().toString())
            .perform(callback);

Content-Type打印问题

LoggerInterceptor 在 ConnectInterceptor 前面执行,在 ConnectInterceptor 中重新设置了Content-Type,而LoggerInterceptor已经打印完了。导致 使用StringBody时,打印的 Content-Type: application/x-www-form-urlencoded.

Download是否考虑加入缓存模式

Download的 Policy 里有 oldAvailable 这种方式,可以在有网络的前提下,读取本地已有的,不用再次请求新的。 也算是一种cache

不过有个问题是,如果在无网络的情况下请求,回调会调用 onException ,无论本地是否有cache

关于Cookie跨域使用的问题

请教严大,我现在有个需求是需要将cookie跨域使用,需要获取原生全部cookie,用的严大的Kalle框架,之前的旧版本可以调用其API: cookieStore.getCookies()拿到全部Cookie ,但是最新这个版本没有这个方法了,只能拿到指定url的cookie :cookieManager.get(url),请问有什么办法一次拿到全部由Kalleg管理的cookie吗?

如果自定义CookieStore 手动添加获取全部Cookie 的方法:

        public List<HttpCookie> getAll() {
            mLock.lock();
            try {
                    List<Cookie> cookieList = mCookieDao.getList("", null, null, null);
                    List<HttpCookie> returnedCookies = new ArrayList<>();
                    for (Cookie cookie : cookieList) {
                        if (!Cookie.isExpired(cookie)) returnedCookies.add(Cookie.toHttpCookie(cookie));
                   }
                   return returnedCookies;
                }catch (Exception ex){
                }finally {
                    mLock.unlock();
               }
        }

请问这样对吗?根据com.yanzhenjie.kalle.cookie.db.CookieDao#getList(String where, String orderBy, String limit, String offset),where字符串传空,则获取所有的:SELECT * FROM COOKIES_TABLE

@yanzhenjie

Network Unavailable

com.yanzhenjie.kalle.exception.NetworkError: Network Unavailable怎么解决

Error Log

04-18 12:49:50.194 2435-2567/pay.com.payment E/AndroidRuntime: FATAL EXCEPTION: Request #1
Process: xxx.xxx.xxxx, PID: 2435
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at com.yanzhenjie.kalle.CancelerManager.removeCancel(CancelerManager.java:50)
at com.yanzhenjie.kalle.simple.RequestManager$2.onEnd(RequestManager.java:101)
at com.yanzhenjie.kalle.simple.Work.done(Work.java:50)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.set(FutureTask.java:205)
at java.util.concurrent.FutureTask.run(FutureTask.java:245)
at com.yanzhenjie.kalle.simple.Work.run(Work.java:38)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)

出现这个错误不频繁 每次请求网络都有可能出现
不单单是指定的一个请求

请求格式如下:
Kalle.post(Urls.IP + Urls.PLAN_LIST)
.param("uid", UserUtil.getUid(mContext))
.perform(new SimpleCallback() {
@OverRide
public void onResponse(SimpleResponse<String, String> response) {
......
}
});

二次封装,如何区分get ,post

        Request.Api apiRequest = null;

        switch (requestMethod) {
            case GET:
                apiRequest = Kalle.get(url);
                break;
            case POST:
                apiRequest = Kalle.post(url);
                break;
        }

        apiRequest.perform();  // wrong

我想 get 和 post 由外部传进来,用相同的逻辑来处理,但是 Kalle.get 和 Kalle.post 返回的Api不一样,如果用了父类的 Request.Api , 就没有perfoem方法

如何支持302重定向?

https://dwz.cn/oHvt1KD7 这是重定向baidu的一个短链接

在sample里执行:

        Kalle.get("https://dwz.cn/oHvt1KD7")
                .perform(new SimpleCallback<String>(this) {
                    @Override
                    public void onResponse(SimpleResponse<String, String> response) {

                        System.out.println("resp " + response.succeed());
                    }
                });

返回这样,然后就没有然后了

2018-10-31 16:52:12.880 18343-18425/com.yanzhenjie.kalle.sample I/KalleSample:  
    Print Response: https://dwz.cn/oHvt1KD7.
    Code: 302
    Access-Control-Allow-Credentials: true.
    Access-Control-Allow-Headers: Origin,Accept,Content-Type,X-Requested-With.
    Access-Control-Allow-Methods: POST,GET,PUT,PATCH,DELETE,HEAD.
    Content-Length: 45.
    Content-Type: text/html; charset=utf-8.
    Date: Wed, 31 Oct 2018 08:52:13 GMT.
    Location: https://www.baidu.com/.
    Okhttp-Response-Source: NETWORK 302.
    Okhttp-Selected-Protocol: http/1.1.

怎么得到最终的返回数据 ,也就是baidu页面的那一坨code

关于okhttp cookies维护的问题

我通过源码发现kalle的cookies维护是在ConnectInterceptor里面动态添加,如果其他库需要用到同一个okhttp实例,例如fresco,glide等图片加载库,就不会有cookies的维护,所以这个okhttp实例还需要自行实现一个cookiejar? 如果我没有猜测错的话,这就会导致一个问题,cookies会被保存两次,然后请求时添加两次,感觉这样并不是太合理,我觉得这个cookies的维护应该单独抽象出来,可以提供默认的实现,用户也可以实现自己的维护逻辑

请求数据出现不正常的现象

按照文档配置完Kalle后,有个使用场景是,get请求,用.path()拼接了url地址,然后请求回来的数据每次都是相同的,(类似点赞或者关注功能,直接在请求地址后拼接用户id,请求回的数据应该是在true和false之间切换,但现在请求回的每一次都一样)但是我直接用OKHttp请求就可以拿到正确的数据,用postman或者其他都是正确的,这是什么导致的啊???很急很关键!

为什么要兼容urlconnection呢

demo中在jsonConverter中打印response,但是这里又拿不到url,并发请求的时候不能区分,如果在log拦截器里打印,jsonConverter中就拿不到response.body.string()。
okhttp3中可以通过
body = ResponseBody.create(contentType, bodyString);
再次封装body放回去,在kalle中我没有办法了。也许是因为要兼容urlconnection牺牲了okhttp3的特性?为什么要兼容urlconnection呢?

StrictMode下method 'close' not called

E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:223)
at java.io.RandomAccessFile.(RandomAccessFile.java:282)
at com.yanzhenjie.kalle.download.BasicWorker.call(BasicWorker.java:121)
at com.yanzhenjie.kalle.download.BasicWorker.call(BasicWorker.java:40)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.yanzhenjie.kalle.download.Work.run(Work.java:41)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

Params实例化

Params params = Params.newBuilder().build();
params.builder().add("name", loginName);
params.builder().add("password", pwd);
Kalle.get(url)
.setParams(params)
.tag(this)
.perform(dialogCallback);

参数增加不上去

关于业务封装

业务封装不够灵活,为什么非要给失败的时候定义一个类型呢?

SimpleCallback直接使用Test对象,response.succeed()返回null,什么情况呢!

Kalle.post(UrlConfig.LOGIN)
.param("name", model.getAccount())
.param("password", model.getPassword())
.perform(new SimpleCallback(BaseApplication.getInstance()) {
@OverRide
public void onResponse(SimpleResponse<String, String> response) {
Test test = JSON.parseObject(response.succeed(), Test.class);
callback.onDataLoaded(test);
}
});

public class Test {
/**
* code : 200
* succeed : true
*/
@JSONField(name = "code")
private int code;
@JSONField(name = "succeed")
private boolean succeed;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public boolean isSucceed() {
return succeed;
}
public void setSucceed(boolean succeed) {
this.succeed = succeed;
}
}

SimpleCallback SimpleResponse<Test, String> Test test= response.succeed()-->返回null,什么情况呢?

Sample安装崩溃

java.lang.RuntimeException: Unable to get provider com.yanzhenjie.album.provider.CameraFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.yanzhenjie.album.provider.CameraFileProvider" on path: DexPathList[[zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/base.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_dependencies_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_resources_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_0_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_1_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_2_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_3_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_4_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_5_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_6_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_7_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_8_apk.apk", zip file "/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.yanzhenjie.kalle.sample-sdiGKo7MJ9_C8MNmbbPLhA==/lib/arm64, /system/lib64, /system/vendor/lib64]]

Android8.0 OnePlus3T

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.