Git Product home page Git Product logo

logginginterceptor's Introduction

LoggingInterceptor - Interceptor for OkHttp3 with pretty logger

Build Status Android Arsenal API SwaggerUI

Usage

val client = OkHttpClient.Builder()
    client.addInterceptor(LoggingInterceptor.Builder()
             .setLevel(Level.BASIC)
             .log(VERBOSE)
             .addHeader("cityCode","53")
             .addQueryParam("moonStatus", "crescent")
             .build())

Download

Gradle:

Groovy

allprojects {
	repositories {
		maven { url 'https://jitpack.io' }
	}
}

dependencies {
	implementation('com.github.ihsanbal:LoggingInterceptor:3.1.0') {
        	exclude group: 'org.json', module: 'json'
    	}
}

kotlin DSL

allprojects {
	repositories {
		maven { setUrl("https://jitpack.io") }
	}
}


dependencies {
	implementation("com.github.ihsanbal:LoggingInterceptor:3.1.0") {
        	exclude(group = "org.json", module = "json")
    	}
}

Maven:

<repository>
   <id>jitpack.io</id>
   <url>https://jitpack.io</url>
</repository>

<dependency>
    <groupId>com.github.ihsanbal</groupId>
    <artifactId>LoggingInterceptor</artifactId>
    <version>3.1.0</version>
</dependency>

Logger & Mock Support

LoggingInterceptor.Builder()
    //Add logger to print log as plain text
    .logger(object : Logger {
          override fun log(level: Int, tag: String?, msg: String?) {
              Log.e("$tag - $level", "$msg")
          }
      })
      //Enable mock for develop app with mock data
      .enableMock(BuildConfig.MOCK, 1000L, object : BufferListener {
          override fun getJsonResponse(request: Request?): String? {
              val segment = request?.url?.pathSegments?.getOrNull(0)
              return mAssetManager.open(String.format("mock/%s.json", segment)).source().buffer().readUtf8()
          }
      })

Level

setLevel(Level.BASIC)
	      .NONE // No logs
	      .BASIC // Logging url,method,headers and body.
	      .HEADERS // Logging headers
	      .BODY // Logging body

Platform - Platform

log(Platform.WARN) // setting log type

Tag

tag("LoggingI") // Request & response each log tag
request("request") // Request log tag
response("response") // Response log tag

Header - Recipes

addHeader("token", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ") // Adding to request

Notes

Some tips about log at this blog post: “The way to get faster on development.”

Also use the filter & configure logcat header for a better result

logginginterceptor's People

Contributors

gturedi avatar ihsanbal avatar mrartcore avatar nagaprakash2020 avatar smelfungus 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

logginginterceptor's Issues

OutOfMemoryError

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 25459360 byte allocation with 8388608 free bytes and 16MB until OOM at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:146) at java.lang.StringBuilder.append(StringBuilder.java:216) at org.json.JSONStringer.newline(JSONStringer.java:360) at org.json.JSONStringer.beforeKey(JSONStringer.java:390) at org.json.JSONStringer.key(JSONStringer.java:374) at org.json.JSONObject.writeTo(JSONObject.java:720) at org.json.JSONStringer.value(JSONStringer.java:237) at org.json.JSONArray.writeTo(JSONArray.java:613) at org.json.JSONStringer.value(JSONStringer.java:233) at org.json.JSONObject.writeTo(JSONObject.java:720) at org.json.JSONObject.toString(JSONObject.java:713) at com.ihsanbal.logging.Printer.getJsonString(Printer.java:192) at com.ihsanbal.logging.LoggingInterceptor.intercept(LoggingInterceptor.java:90) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179) at okhttp3.RealCall$AsyncCall.execute(RealCall.java:129) at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818)

java.lang.ClassCastException: java.lang.String cannot be cast to okhttp3.Request

[com.ihsanbal.logging.LoggingInterceptor.intercept(LoggingInterceptor.java:75), okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92), okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67), okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185), okhttp3.RealCall.execute(RealCall.java:69), com.tianxiang.client.utils.net.core.OkHttpNetEngine$OkHttpExcutor.requestByMethod(OkHttpNetEngine.java:222), com.tianxiang.client.utils.net.core.OkHttpNetEngine.request(OkHttpNetEngine.java:274), com.tianxiang.client.utils.net.task.CommonNetTask.run(CommonNetTask.java:49), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587), java.lang.Thread.run(Thread.java:818)]

Overflow lines

Problem

║ Body:
║ {
║     "msg": "Hello World.Hello World.Hello World.Hello World.Hello World.Hello World.Hello World.
Hello World.Hello World."
║ }

Solution

║ Body:
║ {
║     "msg": "Hello World.Hello World.Hello World.Hello World.Hello World.Hello World.Hello World.
║     Hello World.Hello World."
║ }

New functions

Please, add line width in builder (now in Logger line width hardcoded to 110)
Please form url properly (for images, etc be means of deleting esc symbols), so they could be linkified

Need Support for AGP 7.0.2

Not compatible with new gradle version. Is there any way out?

Here's the error Log
Could not find com.github.ihsanbal:LoggingInterceptor:3.1.0. Required by: project :app

Api update

Update mockable api with postman echo.

I can't set my own tag

In the 2.0.1 version, lines 71 and 72 have the following code:
Response response = chain.proceed(request); List segmentList = ((Request)request.tag()).url().encodedPathSegments();
I took my url from the tag, but I set the url myself, So a ClassCastException occurs when used,I need to set up my own tag to cancel the request at any time through this tag

Log both Headers AND Body?

Is there a way to log both the headers and body of requests and responses? Seems like it's one or the other right now.

I guess I could just add two loggers?

Duplicated Header

Headers repeat when using annotations and header methods together.

OutOfMemoryError

Caused by: java.lang.OutOfMemoryError: Failed to allocate a 33395870 byte allocation with 5148377 free bytes and 4MB until OOM
at java.lang.String.(String.java:233)
at java.lang.String.(String.java:371)
at okio.Buffer.readString(Buffer.kt:306)
at okio.Buffer.readString(Buffer.kt:295)
at com.ihsanbal.logging.Printer$Companion.getResponseBody(Printer.kt:108)
at com.ihsanbal.logging.Printer$Companion.printJsonResponse(Printer.kt:58)
at com.ihsanbal.logging.LoggingInterceptor.printlnResponseLog(LoggingInterceptor.kt:41)
at com.ihsanbal.logging.LoggingInterceptor.intercept(LoggingInterceptor.kt:36)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)

usage problem

Hi !
I found it can not use in OkHttpClient.Builder.addNetworkInterceptor() environment.

java.io.FileNotFoundException: mock/.json

i have .json file in directory assets/mock
But get an error as follows

java.io.FileNotFoundException: mock/.json
at android.content.res.AssetManager.openAsset(Native Method)
at android.content.res.AssetManager.open(AssetManager.java:354)
at android.content.res.AssetManager.open(AssetManager.java:328)
at com.android.wadexi.basedemo.dagger2.modules.app.AppModules$1.getJsonResponse(AppModules.java:92)
at com.ihsanbal.logging.LoggingInterceptor.intercept(LoggingInterceptor.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:200)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1115)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:590)
at java.lang.Thread.run(Thread.java:818)``

Warning in gradle messages when using 2.0.0

Hi,

Just thought I'd let you know, on my project when I bump LoggingInterceptor from 1.0.4 to 2.0.0 my gradle compiles successfully but warns about these lines:

Warning:WARNING: Dependency org.json:json:20160810 is ignored for prodDebug as it may be conflicting with the internal version provided by Android.
Warning:WARNING: Dependency org.json:json:20160810 is ignored for prodRelease as it may be conflicting with the internal version provided by Android.
Warning:WARNING: Dependency org.json:json:20160810 is ignored for fastdevDebug as it may be conflicting with the internal version provided by Android.
Warning:WARNING: Dependency org.json:json:20160810 is ignored for fastdevRelease as it may be conflicting with the internal version provided by Android.

Any insight into what's happening here? It's warned for each flavor I have, and it seems like maybe you're bundling a org.json:json dependency that is usually provided by the Android sdk.

Why is .addQueryParam("query", "0") in the readme?

Hi, in the project I'm working on, somebody copied the usage of this library including the .addQueryParam("query", "0") statement which now broke because an API endpoint checked for allowed url parameters - and query=0 isn't allowed - so it broke.

Any reason this is in the 'Usage' section of the readme (where blindly people copy-paste from)?

Logging interceptor breaks downloading pdf file

Using this interceptor breaks pdf download for me.

The usage is simple, I have a direct link to a pdf file which I download with Retrofit and write into a file. The original pdf has around 199kb, however the downloaded file has around 350kb.

I debugged into the issue and I think the problem is in this line:
https://github.com/ihsanbal/LoggingInterceptor/blob/master/library/src/main/java/com/ihsanbal/logging/LoggingInterceptor.java#L70

This line sets the response body content type to the same content type that the request body has which is not correct behavior. In this case, the request body is application/json and the response body is application/pdf. As a result, the pdf gets downloaded with the wrong encoding and it results in a corrupt file.

Another problem I see is that the interceptor will reformat the body before passing it on which is just asking for problems. The interceptor should pass the original body down the interceptor chain and reformat just for display. It doesn't even check the content type to see if the body is in fact json.

URL address in Response log

Hello @ihsanbal !!!
We`ve been using your library for a while in our android team and we really like it =))
But sometimes we got in unconvinient situations, when we're having couple request before responses. For example, lets say we are have to make 3-5 net requests in a same time. And then we get 3-5 reordered responses back and sometimes it's not very easy to find out which response belongs to which request.

I have investigated your interceptor code and think that I can add this feature. BTW I saw an open issue (#33) about that.

Don't you mind if your library have this functional ? Would be such PR welcomed ?

http message style might be better

just like this:

GET /path

Header1: xxx
Header2: xxx
Header3: xxx
...

Body

/path code msg

Header1: xxx
Header2: xxx
Header3: xxx
...

Body

OutOfMemoryError

I have the next bug reported, maybe could you check the reference to improvement your great library

Regards!

Fatal Exception: java.lang.OutOfMemoryError
at java.lang.String.(String.java:422)
at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642)
at java.lang.StringBuilder.toString(StringBuilder.java:663)
at org.json.JSONStringer.toString(JSONStringer.java:430)
at org.json.JSONArray.toString(JSONArray.java:596)
at com.ihsanbal.logging.Logger.getJsonString(Logger.java:167)
at com.ihsanbal.logging.Logger.printJsonResponse(Logger.java:67)
at com.ihsanbal.logging.LoggingInterceptor.intercept(LoggingInterceptor.java:95)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

Breaks url when request contains [ ]

I'm defining:

@GET("www.api.com/get/")
Call getRequest(@Query("key[one]")  String one)

When printing URL in the logcat. it goes like this http://www.api.com/get/key[one]=one, the clickable part is http://www.api.com/get/key, and it stopped, so it's not a fully clickable url in my case, can it be fixed? Thanks.

NetworkOnMainThreadException error

If loggable is only false I get an error
Process: com.mimoza.photolift, PID: 30503 android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448) at java.net.SocketInputStream.read(SocketInputStream.java:169) at java.net.SocketInputStream.read(SocketInputStream.java:139) at okio.Okio$2.read(Okio.java:140) at okio.AsyncTimeout$2.read(AsyncTimeout.java:237) at okio.RealBufferedSource.read(RealBufferedSource.java:51) at okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.java:389) at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.java:475) at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.java:286) at okio.Buffer.writeAll(Buffer.java:1143) at okio.RealBufferedSource.readString(RealBufferedSource.java:203) at okhttp3.ResponseBody.string(ResponseBody.java:182) at com.mimoza.photolift.Splash$onCreate$1.OnSuccess(Splash.kt:34) at com.teknasyon.ares.network.NetworkFactory$callInit$1.OnSuccess(NetworkFactory.kt:284) at com.teknasyon.ares.network.NetworkFactory.handleApiCallResponse(NetworkFactory.kt:351) at com.teknasyon.ares.network.NetworkFactory.access$handleApiCallResponse(NetworkFactory.kt:39) at com.teknasyon.ares.network.NetworkFactory$callRequest$1$onResponse$1.invokeSuspend(NetworkFactory.kt:340) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask$DefaultImpls.run(Dispatched.kt:235) at kotlinx.coroutines.DispatchedContinuation.run(Dispatched.kt:81) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6710) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770) Suppressed: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448) at java.net.SocketInputStream.read(SocketInputStream.java:169) at java.net.SocketInputStream.read(SocketInputStream.java:139) at okio.Okio$2.read(Okio.java:140) at okio.AsyncTimeout$2.read(AsyncTimeout.java:237) at okio.RealBufferedSource.read(RealBufferedSource.java:51) at okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.java:389) at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.java:475) at okhttp3.internal.Util.skipAll(Util.java:204) at okhttp3.internal.Util.discard(Util.java:186) at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.close(Http1ExchangeCodec.java:511) at okio.ForwardingSource.close(ForwardingSource.java:43) at okhttp3.internal.connection.Exchange$ResponseBodySource.close(Exchange.java:313) at okio.RealBufferedSource.close(RealBufferedSource.java:476) at okhttp3.ResponseBody.$closeResource(ResponseBody.java:137) at okhttp3.ResponseBody.string(ResponseBody.java:183) ... 15 more

Lack of synchronization mechanism

╚═══════════════════════════════════════════════════════════════════════════════════════
I/OkHttpNetEngine: ╔══════ Response ═══════════════════════════════════════════════════════════════════════
I/OkHttpNetEngine: ╔══════ Response ═══════════════════════════════════════════════════════════════════════
I/OkHttpNetEngine: ╔══════ Response ═══════════════════════════════════════════════════════════════════════
I/OkHttpNetEngine: ╔══════ Response ═══════════════════════════════════════════════════════════════════════
I/OkHttpNetEngine: ╔══════ Response ═══════════════════════════════════════════════════════════════════════
I/OkHttpNetEngine: ║ /api/Client/My - is success : true - Received in: 89ms
I/OkHttpNetEngine: ║ /api/Client/ClientUser/My - is success : true - Received in: 111ms
I/OkHttpNetEngine: ║ /api/Client/Message/GetUnReadCount - is success : true - Received in: 172ms
I/OkHttpNetEngine: ║
I/OkHttpNetEngine: ║

gzip Handling Error

I am using Retrofit 2.1.0 together with gson-Converter 2.1.0 and LoggingInterceptor 2.0.2.
If i call a service returning a response with "Content-Encoding: gzip" the following exception occurs.
java.io.IOException: ID1ID2: actual 0x00001fef != expected 0x00001f8b at okio.GzipSource.checkEqual(GzipSource.java:205) at okio.GzipSource.consumeHeader(GzipSource.java:120) at okio.GzipSource.read(GzipSource.java:73) at okio.RealBufferedSource.read(RealBufferedSource.java:45) at okio.ForwardingSource.read(ForwardingSource.java:35) at retrofit2.OkHttpCall$ExceptionCatchingRequestBody$1.read(OkHttpCall.java:279) at okio.RealBufferedSource.request(RealBufferedSource.java:66) at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:387) at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:371) at okhttp3.internal.Util.bomAwareCharset(Util.java:412) at okhttp3.ResponseBody$BomAwareReader.read(ResponseBody.java:248) at com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1287) at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1325) at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549) at com.google.gson.stream.JsonReader.peek(JsonReader.java:425) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:205) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25) at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211) at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)

First step could be just ignoring responses with content-Encoding=gzip and just returning the raw response from the interceptor. (this would disable logging for gzip responses). Another option could maybe be direct usage of GzipResource to decompress the response body. But I think, then you would have to remove the Content-Encoding:gzip header for further response handling by okHttp.

Logging body!

Thanks a lot for such a great library.

It would be really really nice if we can see request data (Body Data)!

Log synchronization

Assume several requests are executed in parallel. And that logs are overlapping each other.
Look at attached example.
log.txt

I think some kind of log queue will solve the issue.

log overlap

Log may be overlaped when concurrent requested.

Add to README that this library should be added after other interceptors

That is, if you want the customized interceptors be added to the logs.

I had a problem where I have this AuthorizationInterceptor that adds an Authorization header for each request and was wondering why it wasn't included included in the logs. The problem is probably me being not fully aware how interceptors works but this won't hurt, I guess.

Anyway, This is the code which doesn't include the Authorization header:

OkHttpClient.Builder()
  .addInterceptor(httpLoggingInterceptor())
  .addInterceptor(AuthorizationInterceptor())
  .build()

To fix this, httpLoggingInterceptor() should be added after the AuthorizationInterceptor() to include the Authorization header in the logs.

Request URL

Can you add to response log url or request ?

How to ensure logging only for DEBUG build?

Firstly, thanks a lot for your awesome library.

In previous version (3.0.0) we used .loggable(BuildConfig.DEBUG) for logging network log only for DEBUG build. Right now (in 3.1.0 version) this method is deprecated and suggested to replace this method with .setLevel(Level.BASIC).

Is this .setLevel(Level.BASIC) method ensure logging only in DEBUG build?
I've tested using this method in release build. Still network log is showing in console (for testing purpose I made debuggable true for release build).

What is your recommended way to ensure LOGGING in debug build and NOT LOGGING in release build?

No logging when sending @POST with @FormUrlEncoded

Whenever try to send request using
@post
@FormUrlEncoded
Never show logs

Method: @POST
2019-06-22 13:30:29.037 16991-17904/com.amyal.dev.debug I/Request: │ 
2019-06-22 13:30:29.038 16991-17904/com.amyal.dev.debug I/Request: │ Headers:
2019-06-22 13:30:29.038 16991-17904/com.amyal.dev.debug I/Request: │ ─ User-Agent: com.amyal.dev.debug / 29-dev(29); (samsung; SM-G920I; SDK 24; Android 7.0)
2019-06-22 13:30:29.038 16991-17904/com.amyal.dev.debug I/Request: │ 
2019-06-22 13:30:29.038 16991-17904/com.amyal.dev.debug I/Request: │ Omitted request body

Could not find com.github.ihsanbal:LoggingInterceptor:2.0.0.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_prodDebugApkCopy'.
   > Could not find com.github.ihsanbal:LoggingInterceptor:2.0.0.
     Required by:
         project :app

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':app'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:94)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:89)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.doConfigure(LifecycleProjectEvaluator.java:76)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.access$000(LifecycleProjectEvaluator.java:33)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$1.execute(LifecycleProjectEvaluator.java:53)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$1.execute(LifecycleProjectEvaluator.java:50)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:50)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:628)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:129)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
	at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:98)
	at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:81)
	at org.gradle.execution.commandline.CommandLineTaskParser.parseTasks(CommandLineTaskParser.java:42)
	at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:44)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
	at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
	at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
	at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36)
	at org.gradle.initialization.DefaultGradleLauncher$2.execute(DefaultGradleLauncher.java:185)
	at org.gradle.initialization.DefaultGradleLauncher$2.execute(DefaultGradleLauncher.java:182)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:182)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
	at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:43)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:75)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':app:_prodDebugApkCopy'.
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.rethrowFailure(DefaultLenientConfiguration.java:169)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.rethrowFailure(DefaultResolvedConfiguration.java:46)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.getResolvedArtifacts(DefaultResolvedConfiguration.java:74)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolvedConfiguration.getResolvedArtifacts(ErrorHandlingConfigurationResolver.java:296)
	at com.android.build.gradle.internal.DependencyManager.collectArtifacts(DependencyManager.java:525)
	at com.android.build.gradle.internal.DependencyManager.resolveConfiguration(DependencyManager.java:354)
	at com.android.build.gradle.internal.DependencyManager.resolveDependencies(DependencyManager.java:263)
	at com.android.build.gradle.internal.DependencyManager.resolveDependencies(DependencyManager.java:166)
	at com.android.build.gradle.internal.TaskManager.resolveDependencies(TaskManager.java:375)
	at com.android.build.gradle.internal.VariantManager.lambda$createVariantData$3(VariantManager.java:607)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.internal.VariantManager.createVariantData(VariantManager.java:603)
	at com.android.build.gradle.internal.VariantManager.createVariantDataForProductFlavors(VariantManager.java:793)
	at com.android.build.gradle.internal.VariantManager.populateVariantDataList(VariantManager.java:487)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:263)
	at com.android.build.gradle.BasePlugin.lambda$createAndroidTasks$6(BasePlugin.java:601)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:596)
	at com.android.build.gradle.BasePlugin.lambda$null$4(BasePlugin.java:526)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.BasePlugin.lambda$createTasks$5(BasePlugin.java:522)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
	at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
	at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy16.afterEvaluate(Unknown Source)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:82)
	... 76 more
Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find com.github.ihsanbal:LoggingInterceptor:2.0.0.
Required by:
    project :app
	at org.gradle.internal.resolve.result.DefaultBuildableComponentResolveResult.notFound(DefaultBuildableComponentResolveResult.java:38)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolveModule(RepositoryChainComponentMetaDataResolver.java:88)
	at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolve(RepositoryChainComponentMetaDataResolver.java:59)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.ComponentResolversChain$ComponentMetaDataResolverChain.resolve(ComponentResolversChain.java:85)
	at org.gradle.api.internal.artifacts.ivyservice.clientmodule.ClientModuleResolver.resolve(ClientModuleResolver.java:45)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ModuleVersionResolveState.resolve(DependencyGraphBuilder.java:622)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ModuleVersionResolveState.getMetaData(DependencyGraphBuilder.java:633)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.calculateTargetConfigurations(DependencyGraphBuilder.java:280)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.attachToTargetConfigurations(DependencyGraphBuilder.java:253)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:161)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:98)
	at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:85)
	at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.run(CacheLockingArtifactDependencyResolver.java:43)
	at org.gradle.internal.Factories$1.create(Factories.java:25)
	at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:187)
	at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:170)
	at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:129)
	at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:191)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:56)
	at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:41)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:119)
	at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:72)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:66)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$3.execute(DefaultConfiguration.java:443)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$3.execute(DefaultConfiguration.java:436)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:436)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:411)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:403)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
	at com.android.build.gradle.internal.DependencyManager.collectArtifacts(DependencyManager.java:524)
	... 101 more

Caused by: java.lang.NoClassDefFoundError: java.nio.charset.StandardCharsets

E/WM-WorkerWrapper( 2298): Caused by: java.lang.NoClassDefFoundError: java.nio.charset.StandardCharsets
E/WM-WorkerWrapper( 2298): at com.ihsanbal.logging.Printer$Companion.bodyToString(Printer.kt:195)
E/WM-WorkerWrapper( 2298): at com.ihsanbal.logging.Printer$Companion.printJsonRequest(Printer.kt:44)
E/WM-WorkerWrapper( 2298): at com.ihsanbal.logging.LoggingInterceptor.printlnRequestLog(LoggingInterceptor.kt:54)
E/WM-WorkerWrapper( 2298): at com.ihsanbal.logging.LoggingInterceptor.intercept(LoggingInterceptor.kt:24)
E/WM-WorkerWrapper( 2298): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
E/WM-WorkerWrapper( 2298): at com.kapplication.appstore.utils.RetrofitUtils$PostParamsInterceptor.intercept(RetrofitUtils.kt:125)
E/WM-WorkerWrapper( 2298): at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100)
E/WM-WorkerWrapper( 2298): at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:197)
E/WM-WorkerWrapper( 2298): at okhttp3.internal.connection.RealCall.execute(RealCall.kt:148)
E/WM-WorkerWrapper( 2298): at retrofit2.OkHttpCall.execute(OkHttpCall.java:204)
E/WM-WorkerWrapper( 2298): at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall.execute(DefaultCallAdapterFactory.java:108)
E/WM-WorkerWrapper( 2298): at com.kapplication.appstore.data.repository.UpgradeRepository$getAppUpgradeInfo$2.invokeSuspend(UpgradeRepository.kt:50)
E/WM-WorkerWrapper( 2298): at com.kapplication.appstore.data.repository.UpgradeRepository$getAppUpgradeInfo$2.invoke(UpgradeRepository.kt)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:160)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
E/WM-WorkerWrapper( 2298): at com.kapplication.appstore.data.repository.UpgradeRepository.getAppUpgradeInfo(UpgradeRepository.kt:47)
E/WM-WorkerWrapper( 2298): at com.kapplication.appstore.works.CheckUpgradeWork.getSelfUpgradeInfo(CheckUpgradeWork.kt:64)
E/WM-WorkerWrapper( 2298): at com.kapplication.appstore.works.CheckUpgradeWork$doWork$2.invokeSuspend(CheckUpgradeWork.kt:37)
E/WM-WorkerWrapper( 2298): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
E/WM-WorkerWrapper( 2298): at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)

Please remove the escape character in the json url

Please remove the escape character in the json url, it will affect the http url preview, it is caused by jsonObject or JsonArray, for example: http:\/\/xx.xxx.xxx\/image\/20210114\/5beaba40044e421f8dbad2b0e5726d42.jpg, \/Replace with/

Printer.class

        private fun getJsonString(msg: String): String {
            var message: String
            message = try {
                when {
                    msg.startsWith("{") -> {
                        val jsonObject = JSONObject(msg)
                        jsonObject.toString(JSON_INDENT)
                    }
                    msg.startsWith("[") -> {
                        val jsonArray = JSONArray(msg)
                        jsonArray.toString(JSON_INDENT)
                    }
                    else -> {
                        msg
                    }
                }
            } catch (e: JSONException) {
                msg
            } catch (e1: OutOfMemoryError) {
                OOM_OMITTED
            }
             // TODO: 2021/1/18 Add code here  
            if (message.indexOf("\\/") != -1) {
                message = message.replace("\\/", "/")
            }
            return message
        }

Manifest merging error

Adding a dependency on LoggingInterceptor results in:

.../app/src/main/AndroidManifest.xml:23:5-32 Error:
        Attribute application@allowBackup value=(false) from AndroidManifest.xml:23:5-32
        is also present at [com.github.ihsanbal:LoggingInterceptor:1.0.3] AndroidManifest.xml:12:9-35 value=(true).
        Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:21:3-198:17 to override.
.../app/src/main/AndroidManifest.xml:26:5-32 Error:
        Attribute application@supportsRtl value=(false) from AndroidManifest.xml:26:5-32
        is also present at [com.github.ihsanbal:LoggingInterceptor:1.0.3] AndroidManifest.xml:14:9-35 value=(true).
        Suggestion: add 'tools:replace="android:supportsRtl"' to <application> element at AndroidManifest.xml:21:3-198:17 to override.

See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.

Seems like these flags should be removed from the manifest?

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.