Git Product home page Git Product logo

spring-rest-oauth2-sample's Introduction

spring-rest-oauth2-sample

中文版

Index

This is REST service sample be supported by:

Build and Run [TOP]

$ cd <spring-rest-oauth2-sample root path>
$ ./gradlew clean build bootRun

Usage [TOP]

Data Format [TOP]

Data format of response:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {}
}

Use the Seed [TOP]

Get access_token [TOP]

Take your token from oauth/token in terminal, if you use ssl remember add -k:

$ curl -X POST -vu ios_app:123456 http://localhost:8080/oauth/token -H "Accept: application/json" -d "password=admin&username=admin&grant_type=password&scope=read&client_secret=123456&client_id=ios_app"

or Advanced REST Client in your Chrome with:

url: http://localhost:8080/oauth/token
POST
headers: Authorization: Basic aW9zX2FwcDoxMjM0NTY= (Encrypt client_id:client_secret by HTTP Basic)
payload: password=admin&username=admin&grant_type=password&scope=read&client_secret=123456&client_id=ios_app

Get New access_token with refresh_token [TOP]

curl -X POST -vu ios_app:123456 http://localhost:8080/oauth/token -H "Accept: application/json" -d "grant_type=refresh_token&refresh_token=<refresh_token_returned>&client_secret=123456&client_id=ios_app"

or use Advanced REST Client:

url: http://localhost:8080/oauth/token
POST
headers: Authorization: Basic <Encrypt client_id:client_secret by HTTP Basic>
payload: grant_type=refresh_token&refresh_token=<refresh_token_returned>

Access to Welcome Resource [TOP]

Use the access_token returned to make the authorized request to the protected endpoint:

$ curl -X GET http://localhost:8080/welcome -H "Authorization: Bearer <access_token_returned>"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {
    "id": 4,
    "content": "Hello, admin!"
  }
}

or use Advanced REST Client:

url: http://localhost:8080/welcome
GET
headers: Authorization: bearer <access_token_returned>

Access to User Resource [TOP]

1. Create New User [TOP]

curl -X POST "http://localhost:8080/resources/v1/users" -H "Authorization: bearer <access_token_returned>" -d "usr=tommy&name=tom&pwd=tom12345&sign=WElnaHE3d2hLM3B6MTBqcTZrM2FOOTdUV0N5cldKcDJuTWMxRW1hck55Qk1FbzRxZm9xMVJzdk9ITTFFNjhQZGxqc0k1ZTdDcmJaemwyN2tFckFHZ3ZKeW1wQVpvRFAlMkZOdm9hWDFkU2s2TzNVVE5YME03NzI0ODklMkY0eXpCUk1kVDFKbHczWEE0RDZCeWo5YmdSbDkwT3FGcE9rSlglMkZ2TVJJVCUyQmNzRXQzdDZ2ZkExUmhaS1QwaVJTTHI1Snhwd3U4dThsbDhyNm1BOXAlMkZmcUprUTVnUzQ1WHV3UTRWJTJCS2dKRlVMaXBTV2NiJTJGOE9INTlhRWd0eU1ZSTJjS1cybk1samhZSVN5YmUyZlluSmw4V0RLMVhtaWo5R3NKaVJUMHR6JTJGM25rWldocHZNVVBiSUJPTTc5WUhnJTJGNXlOUnFIS0VudGslMkZBMXAwMkViZ2haSW5FOHF5VVElM0QlM0Q="

If the request is successful, you will see the following JSON response like this:

{
  "code": "200"
  "operationStatus": "SUCCESS"
  "message": "Successfully"
  "data": {
    "id": 29
    "name": "tom"
    "usr": "tommy"
    "description": null
  }
}

or use Advanced REST Client:

url: http://localhost:8080/resources/v1/users
POST
headers: Authorization: bearer <access_token_returned>
payload: usr=tommy&name=tom&pwd=tom12345&sign=WElnaHE3d2hLM3B6MTBqcTZrM2FOOTdUV0N5cldKcDJuTWMxRW1hck55Qk1FbzRxZm9xMVJzdk9ITTFFNjhQZGxqc0k1ZTdDcmJaemwyN2tFckFHZ3ZKeW1wQVpvRFAlMkZOdm9hWDFkU2s2TzNVVE5YME03NzI0ODklMkY0eXpCUk1kVDFKbHczWEE0RDZCeWo5YmdSbDkwT3FGcE9rSlglMkZ2TVJJVCUyQmNzRXQzdDZ2ZkExUmhaS1QwaVJTTHI1Snhwd3U4dThsbDhyNm1BOXAlMkZmcUprUTVnUzQ1WHV3UTRWJTJCS2dKRlVMaXBTV2NiJTJGOE9INTlhRWd0eU1ZSTJjS1cybk1samhZSVN5YmUyZlluSmw4V0RLMVhtaWo5R3NKaVJUMHR6JTJGM25rWldocHZNVVBiSUJPTTc5WUhnJTJGNXlOUnFIS0VudGslMkZBMXAwMkViZ2haSW5FOHF5VVElM0QlM0Q=

2. Show All Users [TOP]

$ curl -X GET "http://localhost:8080/resources/v1/users/index?sign=dWFOOUVDdXFnYmMyUG55TXJ0aVlNbHpEOEdzQ2VpSHFRNVloRlE3ajBlMGUxcHRrYXB2T2RqSjJWdjczQ0tJaFVrJTJGckhwdXEzT0lRdDJadzF3ZnVONzhoV3JBMkNZTjBSV24lMkJtSW95MjJlRDYxOCUyRkpjNWpTWjRGQXBuOGw4Zzl6VExKN3dHVEU0T1VGeU5vS1ZDcldJSmFkT3NPSk0wNFFjWXMyNTd3ZmtHSCUyQnRCTHhXVVJEbjBZUEFwRjd1amtKZ3FUUW83d3o4VmlWdVY1NThnM3BKZ2QlMkIlMkZNWUV2MEpzTmMlMkZKNkRHaGhROWR5Z2VFRExJUHdzZjZ0dkZqVFlvRVFrY1B2WmhQV0p1R0VEMjZSZHRnVFdWTlNObyUyQjVmZU9MSHBENW9TSHVyVXdrM2FtMFlqTUQyRFoyRkdmek91WkI1NzhrWTZIc1VUUGhvU0diajBzdyUzRCUzRA==" -H "Authorization: bearer <access_token_returned>"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {
    "objects": [
      {
        "id": 1,
        "name": "root",
        "usr": "root",
        "description": "root account"
      },
      {
        "id": 5,
        "name": "guest",
        "usr": "guest",
        "description": "guest account"
      },
      {
        "id": 29,
        "name": "tom",
        "usr": "tommy",
        "description": null
      },
      {
        "id": 4,
        "name": "admin",
        "usr": "admin",
        "description": "admin account"
      }
    ]
  }
}

or use Advanced REST Client:

url: http://localhost:8080/resources/v1/users/index?sign=dWFOOUVDdXFnYmMyUG55TXJ0aVlNbHpEOEdzQ2VpSHFRNVloRlE3ajBlMGUxcHRrYXB2T2RqSjJWdjczQ0tJaFVrJTJGckhwdXEzT0lRdDJadzF3ZnVONzhoV3JBMkNZTjBSV24lMkJtSW95MjJlRDYxOCUyRkpjNWpTWjRGQXBuOGw4Zzl6VExKN3dHVEU0T1VGeU5vS1ZDcldJSmFkT3NPSk0wNFFjWXMyNTd3ZmtHSCUyQnRCTHhXVVJEbjBZUEFwRjd1amtKZ3FUUW83d3o4VmlWdVY1NThnM3BKZ2QlMkIlMkZNWUV2MEpzTmMlMkZKNkRHaGhROWR5Z2VFRExJUHdzZjZ0dkZqVFlvRVFrY1B2WmhQV0p1R0VEMjZSZHRnVFdWTlNObyUyQjVmZU9MSHBENW9TSHVyVXdrM2FtMFlqTUQyRFoyRkdmek91WkI1NzhrWTZIc1VUUGhvU0diajBzdyUzRCUzRA==
GET
headers: Authorization: bearer <access_token_returned>

3. Show Users in Page [TOP]

$ curl -X GET "http://localhost:8080/resources/v1/users?pageNo=0&sign=dWFOOUVDdXFnYmMyUG55TXJ0aVlNbHpEOEdzQ2VpSHFRNVloRlE3ajBlMGUxcHRrYXB2T2RqSjJWdjczQ0tJaFVrJTJGckhwdXEzT0lRdDJadzF3ZnVONzhoV3JBMkNZTjBSV24lMkJtSW95MjJlRDYxOCUyRkpjNWpTWjRGQXBuOGw4Zzl6VExKN3dHVEU0T1VGeU5vS1ZDcldJSmFkT3NPSk0wNFFjWXMyNTd3ZmtHSCUyQnRCTHhXVVJEbjBZUEFwRjd1amtKZ3FUUW83d3o4VmlWdVY1NThnM3BKZ2QlMkIlMkZNWUV2MEpzTmMlMkZKNkRHaGhROWR5Z2VFRExJUHdzZjZ0dkZqVFlvRVFrY1B2WmhQV0p1R0VEMjZSZHRnVFdWTlNObyUyQjVmZU9MSHBENW9TSHVyVXdrM2FtMFlqTUQyRFoyRkdmek91WkI1NzhrWTZIc1VUUGhvU0diajBzdyUzRCUzRA==" -H "Authorization: Bearer <access_token_returned>"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {
    "page": {
      "content": [
        {
          "id": 1,
          "name": "root",
          "usr": "root",
          "description": "root account"
        },
        {
          "id": 4,
          "name": "admin",
          "usr": "admin",
          "description": "admin account"
        },
        {
          "id": 5,
          "name": "guest",
          "usr": "guest",
          "description": "guest account"
        },
        {
          "id": 29,
          "name": "tom",
          "usr": "tommy",
          "description": null
        }
      ],
      "totalElements": 4,
      "last": true,
      "totalPages": 1,
      "size": 20,
      "number": 0,
      "sort": [
        {
          "direction": "ASC",
          "property": "id",
          "ignoreCase": false,
          "nullHandling": "NATIVE",
          "ascending": true
        }
      ],
      "first": true,
      "numberOfElements": 4
    }
  }
}

or use Advanced REST Client:

url: http://localhost:8080/resources/users?pageNo=0&sign=dWFOOUVDdXFnYmMyUG55TXJ0aVlNbHpEOEdzQ2VpSHFRNVloRlE3ajBlMGUxcHRrYXB2T2RqSjJWdjczQ0tJaFVrJTJGckhwdXEzT0lRdDJadzF3ZnVONzhoV3JBMkNZTjBSV24lMkJtSW95MjJlRDYxOCUyRkpjNWpTWjRGQXBuOGw4Zzl6VExKN3dHVEU0T1VGeU5vS1ZDcldJSmFkT3NPSk0wNFFjWXMyNTd3ZmtHSCUyQnRCTHhXVVJEbjBZUEFwRjd1amtKZ3FUUW83d3o4VmlWdVY1NThnM3BKZ2QlMkIlMkZNWUV2MEpzTmMlMkZKNkRHaGhROWR5Z2VFRExJUHdzZjZ0dkZqVFlvRVFrY1B2WmhQV0p1R0VEMjZSZHRnVFdWTlNObyUyQjVmZU9MSHBENW9TSHVyVXdrM2FtMFlqTUQyRFoyRkdmek91WkI1NzhrWTZIc1VUUGhvU0diajBzdyUzRCUzRA==
GET
headers: Authorization: bearer <access_token_returned>

4. Show User by id [TOP]

$ curl -X GET "http://localhost:8080/resources/v1/users/29?sign=RFpwRXlRJTJCRDI5Q1FHYW95eXk3YVN0b0s2M25kT21ZMjFmWm9PNFAyMzYlMkJ4NlJtVHdTTDREWWY2Wmp0dzIzMWtoa3ZPRkFMbThFYmlFSmszSEFOMW5TaUclMkY2NXlwJTJCMnJ1UTRYZUFJcW1oQm5ZcUVGN0NlbyUyRjFmbmlLalpSaWVLYUlaOHZ2NFJLRWdjaHN3T1FhcE8xOE1wSnBuRTk4JTJGQWJGenBROXNMTjdzaGN4bTFtUzhzRFNLTFNLckZpb1VMSDIxVXAzZmRmWThmUmZhcTRjJTJGcjVUSTcwT0ZFeVVGbnJURUM1SGRGM0hVU2E5V2xPcG9zRiUyRmE3dVJXZEZNWEF6VGV4RlQxYW5mNHYwb245M3hmM3k0WmhqT0lNVlp6eW1kJTJGTUkzZW8yNEFuYkE3VzdLUVFEaHM4UGRUZHZlJTJCaTFLMFJwcmolMkZyS0NSRTElMkJ2ZVhOJTJGN2clM0QlM0Q=" -H "Authorization: Bearer <access_token_returned>"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {
    "id": 4,
    "name": "admin",
    "usr": "admin",
    "description": "admin account"
  }
}

or use Advanced REST Client:

url: http://localhost:8080/resources/v1/users/29?sign=RFpwRXlRJTJCRDI5Q1FHYW95eXk3YVN0b0s2M25kT21ZMjFmWm9PNFAyMzYlMkJ4NlJtVHdTTDREWWY2Wmp0dzIzMWtoa3ZPRkFMbThFYmlFSmszSEFOMW5TaUclMkY2NXlwJTJCMnJ1UTRYZUFJcW1oQm5ZcUVGN0NlbyUyRjFmbmlLalpSaWVLYUlaOHZ2NFJLRWdjaHN3T1FhcE8xOE1wSnBuRTk4JTJGQWJGenBROXNMTjdzaGN4bTFtUzhzRFNLTFNLckZpb1VMSDIxVXAzZmRmWThmUmZhcTRjJTJGcjVUSTcwT0ZFeVVGbnJURUM1SGRGM0hVU2E5V2xPcG9zRiUyRmE3dVJXZEZNWEF6VGV4RlQxYW5mNHYwb245M3hmM3k0WmhqT0lNVlp6eW1kJTJGTUkzZW8yNEFuYkE3VzdLUVFEaHM4UGRUZHZlJTJCaTFLMFJwcmolMkZyS0NSRTElMkJ2ZVhOJTJGN2clM0QlM0Q=
GET
headers: Authorization: bearer <access_token_returned>

5. Show User by usr [TOP]

$ curl -X GET "http://localhost:8080/resources/v1/users/usr/admin?sign=TEtjbkozTWVXNUxxOUJTYmxubUNJQkhqN0dPeE1RUzdqM0tURThsVXlJd29sQXMlMkZnTU1WejVrTklpTDA2ZVBMdExJJTJGZThLWUp0aiUyRlJDN3JockhkYm9GaHVFeUZZcHB2MEhwVTJ2OEoxYVoyYXJHZm1jWiUyQlBRJTJCdEFVQ016d2ZvSVhFV25mMG1zelJxMXNQMm43MVRrWnh1MiUyQjdrb1BQamNlJTJGTmw2RXZSdWpmb3Y1Ynh0JTJCZ2RtTHNGUllESFVZQU04NHBOdURoNmlvYWMyblFPdXFGeHhSeXNITXJkYklLQnhpYXFkcVVJY3NVQ1JvMDhJTVptaXFIVmNvJTJGWXNTRnRRMU4weFJvNjRaS2JxJTJCb3dZRkdvT1cxRDl4T0J3MzdWMUYxelNlRm5KZExONjBQNWwwSlg2VGtLeEw3M0JqSnRWcDZvaU1VZEJhdDgySDFFY3N6R0ElM0QlM0Q=" -H "Authorization: Bearer <access_token_returned>"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {
    "id": 4,
    "name": "admin",
    "usr": "admin",
    "description": "admin account"
  }
}

or use Advanced REST Client:

url: http://localhost:8080/resources/v1/users/usr/admin?sign=TEtjbkozTWVXNUxxOUJTYmxubUNJQkhqN0dPeE1RUzdqM0tURThsVXlJd29sQXMlMkZnTU1WejVrTklpTDA2ZVBMdExJJTJGZThLWUp0aiUyRlJDN3JockhkYm9GaHVFeUZZcHB2MEhwVTJ2OEoxYVoyYXJHZm1jWiUyQlBRJTJCdEFVQ016d2ZvSVhFV25mMG1zelJxMXNQMm43MVRrWnh1MiUyQjdrb1BQamNlJTJGTmw2RXZSdWpmb3Y1Ynh0JTJCZ2RtTHNGUllESFVZQU04NHBOdURoNmlvYWMyblFPdXFGeHhSeXNITXJkYklLQnhpYXFkcVVJY3NVQ1JvMDhJTVptaXFIVmNvJTJGWXNTRnRRMU4weFJvNjRaS2JxJTJCb3dZRkdvT1cxRDl4T0J3MzdWMUYxelNlRm5KZExONjBQNWwwSlg2VGtLeEw3M0JqSnRWcDZvaU1VZEJhdDgySDFFY3N6R0ElM0QlM0Q=
GET
headers: Authorization: bearer <access_token_returned>

6. Update User by id [TOP]

curl -X POST "http://localhost:8080/resources/v1/users/29" -H "Authorization: bearer <access_token_returned>" -d "usr=tommy&name=jerry&pwd=tom54321&sign=UmslMkZVaFI2Mzc4N3VGd0hzblRXaE9QSE9aNHVZMXdLWmxwcDk0alRndjg2TFFaRkx1NlROUSUyQlN2UFlWWXdIcU50T25LZnk5WlZpUjgzblROYnNBTEJSZ2FHQ29zY29KZm1iOEVsTTFFeUhrbmdRSWVQdk1PTUI5N0RkY1pvd2ZVSHolMkJtalJPWnhDeW9TYkhtJTJGanFPNk9UYWFNanUlMkI3aFRHSm5HaXd2SXV2V0RYbjg4Vnc5ZjZCSUlrVW1UTFJBTXhOdEh6ZlZXWTRNS2ZnV3pzUGZIbllmdWlIM3U3Qmw1cEoxdnJpdVI1TSUyQnhubEpVOXZJOCUyQlpFTDNQVGlLaEllcFRrNjFSMVRCYktFeEhQaWJDUlNmZHVqZkpqMTclMkJYM2kxWTk1emplSmhGSkFnaUVDcmtDUWYlMkZzMkRLUU1vak94YjJ4emdYbXJzSEpSUlpmWkQwQWJ3JTNEJTNE"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Successfully",
  "data": {
    "id": 29,
    "name": "jerry",
    "usr": "tommy",
    "description": null
  }
}

or use Advanced REST Client:

url: http://localhost:8080/resources/v1/users/29
POST
headers: Authorization: bearer <access_token_returned>
payload: usr=tommy&name=jerry&pwd=tom54321&sign=UmslMkZVaFI2Mzc4N3VGd0hzblRXaE9QSE9aNHVZMXdLWmxwcDk0alRndjg2TFFaRkx1NlROUSUyQlN2UFlWWXdIcU50T25LZnk5WlZpUjgzblROYnNBTEJSZ2FHQ29zY29KZm1iOEVsTTFFeUhrbmdRSWVQdk1PTUI5N0RkY1pvd2ZVSHolMkJtalJPWnhDeW9TYkhtJTJGanFPNk9UYWFNanUlMkI3aFRHSm5HaXd2SXV2V0RYbjg4Vnc5ZjZCSUlrVW1UTFJBTXhOdEh6ZlZXWTRNS2ZnV3pzUGZIbllmdWlIM3U3Qmw1cEoxdnJpdVI1TSUyQnhubEpVOXZJOCUyQlpFTDNQVGlLaEllcFRrNjFSMVRCYktFeEhQaWJDUlNmZHVqZkpqMTclMkJYM2kxWTk1emplSmhGSkFnaUVDcmtDUWYlMkZzMkRLUU1vak94YjJ4emdYbXJzSEpSUlpmWkQwQWJ3JTNEJTNE

7. Delete User by id [TOP]

curl -X DELETE "http://localhost:8080/resources/v1/users/29?sign=RFpwRXlRJTJCRDI5Q1FHYW95eXk3YVN0b0s2M25kT21ZMjFmWm9PNFAyMzYlMkJ4NlJtVHdTTDREWWY2Wmp0dzIzMWtoa3ZPRkFMbThFYmlFSmszSEFOMW5TaUclMkY2NXlwJTJCMnJ1UTRYZUFJcW1oQm5ZcUVGN0NlbyUyRjFmbmlLalpSaWVLYUlaOHZ2NFJLRWdjaHN3T1FhcE8xOE1wSnBuRTk4JTJGQWJGenBROXNMTjdzaGN4bTFtUzhzRFNLTFNLckZpb1VMSDIxVXAzZmRmWThmUmZhcTRjJTJGcjVUSTcwT0ZFeVVGbnJURUM1SGRGM0hVU2E5V2xPcG9zRiUyRmE3dVJXZEZNWEF6VGV4RlQxYW5mNHYwb245M3hmM3k0WmhqT0lNVlp6eW1kJTJGTUkzZW8yNEFuYkE3VzdLUVFEaHM4UGRUZHZlJTJCaTFLMFJwcmolMkZyS0NSRTElMkJ2ZVhOJTJGN2clM0QlM0Q=" -H "Authorization: bearer <access_token_returned>"

If the request is successful, you will see the following JSON response like this:

{
  "code": "200",
  "operationStatus": "SUCCESS",
  "message": "Delete user successfully.",
  "data": null
}

or use Advanced REST Client:

url: http://localhost:8080/resources/v1/users/29?sign=RFpwRXlRJTJCRDI5Q1FHYW95eXk3YVN0b0s2M25kT21ZMjFmWm9PNFAyMzYlMkJ4NlJtVHdTTDREWWY2Wmp0dzIzMWtoa3ZPRkFMbThFYmlFSmszSEFOMW5TaUclMkY2NXlwJTJCMnJ1UTRYZUFJcW1oQm5ZcUVGN0NlbyUyRjFmbmlLalpSaWVLYUlaOHZ2NFJLRWdjaHN3T1FhcE8xOE1wSnBuRTk4JTJGQWJGenBROXNMTjdzaGN4bTFtUzhzRFNLTFNLckZpb1VMSDIxVXAzZmRmWThmUmZhcTRjJTJGcjVUSTcwT0ZFeVVGbnJURUM1SGRGM0hVU2E5V2xPcG9zRiUyRmE3dVJXZEZNWEF6VGV4RlQxYW5mNHYwb245M3hmM3k0WmhqT0lNVlp6eW1kJTJGTUkzZW8yNEFuYkE3VzdLUVFEaHM4UGRUZHZlJTJCaTFLMFJwcmolMkZyS0NSRTElMkJ2ZVhOJTJGN2clM0QlM0Q=
DELETE
headers: Authorization: bearer <access_token_returned>

Other resources [TOP]

Refer to previous user resource. And you can generate the sign with SignTest

Deploy [TOP]

  1. Build war and use tomcat.
  2. Build jar and run java -jar foo.jar
  3. Use Docker. You can build your docker image by Dockerfile. And run it with docker-compose.yml.

License [TOP]

MIT

Copyright (c) 2015 saintdan

Version History [TOP]

Version history is here. ;)

spring-rest-oauth2-sample's People

Contributors

danielliao11 avatar

Watchers

James Cloos avatar  avatar

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.