Giter VIP home page Giter VIP logo

php-http-client's Introduction

SendGrid Logo

Tests Latest Version on Packagist Twitter Follow GitHub contributors MIT licensed

Quickly and easily access any RESTful or RESTful-like API.

If you are looking for the SendGrid API client library, please see this repo.

Announcements

All updates to this library are documented in our CHANGELOG.

Table of Contents

Installation

Prerequisites

  • PHP version 7.3, 7.4, 8.0, or 8.1

Install with Composer

Add php-http-client to your composer.json file. If you are not using Composer, you should be. It's an excellent way to manage dependencies in your PHP application.

{
  "require": {
    "sendgrid/php-http-client": "^4.1.1"
  }
}

Then at the top of your PHP script require the autoloader:

require __DIR__ . '/vendor/autoload.php';

Then from the command line:

composer install

Install without Composer

You should create a lib directory in the directory of your application and clone to lib repositories php-http-client and sendgrid-php:

$ cd /path/to/your/app
$ mkdir lib
$ cd lib
$ git clone https://github.com/sendgrid/php-http-client.git

In the next step you should create loader.php:

$ cd /path/to/your/app
$ touch loader.php

And add the code below to the loader.php:

<?php

require_once __DIR__ . '/lib/php-http-client/lib/Client.php';
require_once __DIR__ . '/lib/php-http-client/lib/Response.php';

After it you can use the php-http-client library in your project:

<?php

include __DIR__ . '/loader.php';

$client = new SendGrid\Client();

Quick Start

Here is a quick example:

GET /your/api/{param}/call

// include __DIR__ . '/loader.php';
require 'vendor/autoload.php';
$apiKey = YOUR_SENDGRID_API_KEY;
$authHeaders = [
    'Authorization: Bearer ' . $apiKey
];
$client = new SendGrid\Client('https://api.sendgrid.com', $authHeaders);
$param = 'foo';
$response = $client->your()->api()->_($param)->call()->get();

var_dump(
    $response->statusCode(),
    $response->headers(),
    $response->body()
);

POST /your/api/{param}/call with headers, query parameters and a request body with versioning.

// include __DIR__ . '/loader.php';
require 'vendor/autoload.php';
$apiKey = YOUR_SENDGRID_API_KEY;
$authHeaders = [
    'Authorization: Bearer ' . $apiKey
];
$client = new SendGrid\Client('https://api.sendgrid.com', $authHeaders);
$queryParams = [
    'hello' => 0, 'world' => 1
];
$requestHeaders = [
    'X-Test' => 'test'
];
$data = [
    'some' => 1, 'awesome' => 2, 'data' => 3
];
$param = 'bar';
$response = $client->your()->api()->_($param)->call()->post($data, $queryParams, $requestHeaders);

var_dump(
    $response->statusCode(),
    $response->headers(),
    $response->body()
);

If there is an issues with the request, such as misconfigured CURL SSL options, an InvalidRequest will be thrown with message from CURL on why the request failed. Use the message as a hit to troubleshooting steps of your environment.

Usage

Environment Variables

You can do the following to create a .env file:

cp .env_example .env

Then, just add your API Key into your .env file.

How to Contribute

We encourage contribution to our libraries, please see our CONTRIBUTING guide for details.

Quick links:

Thanks

We were inspired by the work done on birdy and universalclient.

About

php-http-client is maintained and funded by Twilio SendGrid, Inc. The names and logos for php-http-client are trademarks of Twilio SendGrid, Inc.

# Support

If you need help using SendGrid, please check the Twilio SendGrid Support Help Center.

License

The MIT License (MIT)

php-http-client's People

Contributors

agh1 avatar akeeman avatar alex2sat avatar alextech avatar braunson avatar budirec avatar ciceropablo avatar colinodell avatar eshanholtz avatar goteamtim avatar jennifermah avatar jmauerhan avatar kampalex avatar mazanax avatar misantron avatar murich avatar ninsuo avatar nvzard avatar pawel-lewtak avatar pawka avatar peter279k avatar prozsolt avatar pushkyn avatar redbrickone avatar taluu avatar thepriefy avatar thinkingserious avatar tiwarishubham635 avatar twilio-ci avatar twilio-dx 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  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

php-http-client's Issues

Private members make library non-extensible

Due to the use of private members, the Client class cannot be extended into a custom class in my application. I am assuming extensibility is desirable since many of the properties are marked as protected. Changing the private members to be protected should suffice.

Add/Update Badges on README

Similar to what was done on the SendGrid node README:

  • put the logo at the top of the list
  • Add License like so
  • make sure the other badges are available like so:
![SendGrid Logo](https://uiux.s3.amazonaws.com/2016-logos/email-logo%402x.png)

For the following, make sure the correct repo is linked!
For email notifications, you can change the "nodejs" to the language of this repo (e.g. java, python, ruby, php, csharp, go, etc)

[![BuildStatus](https://travis-ci.org/sendgrid/sendgrid-nodejs.svg?branch=master)](https://travis-ci.org/sendgrid/sendgrid-nodejs)
[![Email Notifications Badge](https://dx.sendgrid.com/badge/nodejs)](https://dx.sendgrid.com/newsletter/nodejs)
[![npm](https://img.shields.io/npm/l/express.svg)]()
[![Twitter Follow](https://img.shields.io/twitter/follow/sendgrid.svg?style=social&label=Follow)](https://twitter.com/sendgrid)
[![GitHub contributors](https://img.shields.io/github/contributors/sendgrid/sendgrid-nodejs.svg)](https://github.com/sendgrid/sendgrid-nodejs/graphs/contributors)

Thank you and happy #Hacktoberfest!!

Add unittest to check for specific repo files

This repo should have the following list of files included:

  • ./Docker or docker/Docker
  • ./docker-compose.yml or ./docker/docker-compose.yml
  • ./.env_sample
  • ./.gitignore
  • ./.travis.yml
  • ./.codeclimate.yml
  • ./CHANGELOG.md
  • ./CODE_OF_CONDUCT.md
  • ./CONTRIBUTING.md
  • ./.github/ISSUE_TEMPLATE
  • ./LICENSE.md
  • ./.github/PULL_REQUEST_TEMPLATE
  • ./README.md
  • ./TROUBLESHOOTING.md
  • ./USAGE.md
  • ./USE_CASES.md

This PR is only asking for tests of the existence of these files, if the files do not exist when you run the tests - do not worry about the tests not passing. We will identify this and create a new PR for the issue.
Thank you!

Add a unittest to check the license.md file date range

The end year in the license file should be "this year" and this should be checked on every run of the tests. If the end year is no correct, fail the test.
example:

Copyright (c) 2012-2016 SendGrid, Inc.
It is 2017, so this should be:
Copyright (c) 2012-2017 SendGrid, Inc.
and the test should fail.
--done

Auto-generate the release notes upon release

Issue Summary

For every release, we hand craft the release notes on GitHub, now we would like to automate this process. Please see the existing release notes for an example. The contents of the release notes are generated from the CHANGELOG.md file. Here is the documentation for updating the release notes via the GitHub API.

Acceptance Criteria

  • A script, which when run, creates a release note update based on the last deployed release

Test enhancement

Issue Summary

This test builds don't update for the long time. This works are as follows:

  • Upgrade the PHPUnit version.
  • Modify the Travis setting in .travis.yml.
  • Using the class-based PHPUnit namespace for the latest PHPUnit version.
  • Add the phpunit.xml.dist in test folder.

Add a .env_sample file

Our preference is that users have an environment file when using the SendGrid API, because it is less likely that someone would commit their credentials to github.

Please make a couple changes:

  • make a .env_sample file that contains: export SENDGRID_API_KEY=''
  • make (or add) a .gitignore file and include .env
  • add instructions to the README file about how to copy .env_sample to .env and add the API Key

Namespacing still does not work

Issue Summary

Have you actually tested this code using composer and namespaces?

It should be possible to do the following:

`require 'vendor/autoload.php';
use SendGrid\Client;

$client = new SendGrid\Client(...);`

However, this does not work. It is still necessary to explicitly include the file:

`require 'vendor/sendgrid/php-http-client/lib/SendGrid/client.php';

$client = new SendGrid\Client(...);`

It would be nice if you could fix your code so it works the same way as other PHP packages.

Update Client to handle response data in a new method

Method makeRequest has 33 lines of code (exceeds 25 allowed). Consider refactoring.

https://codeclimate.com/github/sendgrid/php-http-client/lib/Client.php#issue_59f3f044c7fa44000100001a

Is it possible to move all of this to another method in the class?

$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
 
        $responseBody = substr($response, $headerSize);
        $responseHeaders = substr($response, 0, $headerSize);
 
        $responseHeaders = explode("\n", $responseHeaders);
        $responseHeaders = array_map('trim', $responseHeaders);
 
        curl_close($curl);
     
        $response = new Response($statusCode, $responseBody, $responseHeaders);

Also, can the retry logic be moved to another method?

       if ($statusCode == 429 && $retryOnLimit) {
            $headers = $response->headers(true);
            $sleepDurations = $headers['X-Ratelimit-Reset'] - time();
            sleep($sleepDurations > 0 ? $sleepDurations : 0);
            return $this->makeRequest($method, $url, $body, $headers, false);
        }

Auto-generate the CHANGELOG.md file upon release

Issue Summary

For every release, we currently hand craft a CHANGELOG.md update, now we would like to automate this process. Please see the existing CHANGELOG.md for formatting structure.

Acceptance Criteria

  • A script, which when run, creates a CHANGELOG.md update based on any merged PRs since the last release.

Update .md files for SEO-ness

We received an awesome PR for #hacktoberfest on our ruby library
We would love to see the same thing on the README in this repo as well.
Please replace the "-" with "_" in README, CONTRIBUTING, USE_CASES, USAGE files.

Thanks and happy Hacktoberfest!!

Require conformance to style standards

Issue Summary

In the CONTRIBUTING.md file there is a section on Style Guidelines & Naming Conventions. Please review and implement a check in Travis CI. If there are any style errors, either fix or create a rule to exclude the error.

Before writing any code, we suggest you review our CONTRIBUTING.md file and propose your solution for discussion here in the comments. Thank you!

Aceptance Criteria

  • TravisCI checks that the code conforms to our Style Guidelines & Naming Conventions as defined in our CONTRIBUTING.md file
  • tests pass locally, in Travis CI and using Docker

Dockerize this repo!

Issue Summary

It is really nice to be able to develop locally inside a docker container! Please dockerize this repo!

  • Please setup docker-compose to use a local volume for the library files
  • Please add information to the README and USAGE files about how to startup the container

Implement auto-deploy to package manager

Issue Summary

When all tests on the master branch pass in Travis CI, we would like to auto-deploy the release to the package manager.

Before writing any code, we suggest you review our CONTRIBUTING.md file and propose your solution for discussion here in the comments. Thank you!

Aceptance Criteria

  • when Travis CI passes all tests on the master branch we auto-deploy to the package manager
  • the version is determined by the CHANGELOG.md

Client class does not translate body parameters for GET requests

Feature request.

The Client class makes no translation of the body parameter into query string parameters when a GET request is made. When a GET request is made, developers are currently required to build their own query string and pass it to the client as part of the url parameter. Having the client object do the translation would make for a smoother developer experience, and ensures both calls follow the same pattern.

Document new Git workflow in CHANGELOG.md

Issue Summary

We want to update our git workflow to function more like Gitflow. We need to update the CONTRIBUTING.md file and PULL_REQUEST_TEMPLATE to direct contributors to fork/branch off the development branch and to merge their PRs with the development branch. Once this issue is complete, we will be creating the development branch and making that branch the default. This is part of a larger strategy to execute releases for this SDK on a predictable cadence.

Acceptance Criteria

  • Update CONTRIBUTING.md documentation, explaining the process of forking and branching off the development branch and submitting PRs agains the development branch.
  • Update PULL_REQUEST_TEMPLATE with the same addition to the CONTRIBUTING.md documentation.

Stop using insecure option by default

Issue Summary

...
CURLOPT_SSL_VERIFYPEER => false
...

Steps to Reproduce

  1. Install the library.
  2. Use it.
  3. Get a MITM attacker
  4. Don't notice it because we're not validating SSL certificates

Technical details:

  • php-http-client Version: master
  • PHP Version: 7.1

Why would you disable SSL peer verification by default in a library??
At the very least people incapable of configuring their servers decently should disable security options manually. Current it's the other way around and only people randomly inspecting source code notice that you're disabling SSL security features by default...

Create a Use Cases Directory

Due to the success we have seen from hacktoberfest, we are seeing more people create use cases. This is amazing!
We want to make sure that everyone can find them. Please help us to break up this file and make it easier to read and manage:

  • Create a Use Cases Directory
  • Put a README.md in this directory
  • Make a file in the new directory for each individual Use Case from USE_CASES.md, copy the content to this file
  • For each file you've created, link to it from the README you created
  • Organize the links in the README by type
  • Make sure the names of the files you created are related to the Use Case
    Thank you!

Unable to use both php-http-client and sendgrid-php within the same application due to clashing class names

Issue Summary

Within the same application, if both php-http-client and sendgrid-php are managed via composer and loaded into the application using the autoloader, because both libraries contain a SendGrid\Response class with different properties, it causes an error

Steps to Reproduce

  1. Create an application or library and through composer require the latest versions of php-http-client and sendgrid-php
  2. Use the composer autoloader to allow use of the sendgrid libraries within your own code
  3. Make a call to the web API using php-http-client (for example, to retrieve all templates). This works fine and returns a response.
  4. Send an email using the \SendGrid class in sendgrid-php. The email sends, but on trying to return a response, it errors:

PHP Notice: Undefined property: SendGrid\Response::$code in /Users/lee.stone/components/Email/vendor/sendgrid/sendgrid/lib/SendGrid.php on line 119

PHP Notice: Undefined property: SendGrid\Response::$raw_body in /Users/lee.stone/components/Email/vendor/sendgrid/sendgrid/lib/SendGrid.php on line 120

This in turn causes a SendGrid Exception to be thrown:
SendGrid\Exception: in /Users/lee.stone/components/Email/vendor/sendgrid/sendgrid/lib/SendGrid.php on line 120

This is caused as both libraries have a SendGrid\Response Class.

As the php-http-client doesn't support sending emails, but is seen as the replacement for interacting with the Web API compared to the client in sendgrid-php, I would expect to be able to use both libraries within the same application so I can query data and send emails. One of the response classes may need its namespace to be changed to support this.

Technical details:

  • php-http-client Version: 1.0.1
  • PHP Version: 5.4

Latest commit broke SendGrid\Client

Issue Summary

The latest commit breaks sending emails.

The latest commit:
cc7138b

Env:
PHP7.2

Steps to Reproduce

Run composer update on sengrid\sendgrid package

Technical details:

PHP Notice: Object of class SendGrid\Client could not be converted to int in /srv/www/api/vendor/sendgrid/php-http-client/lib/Client.php on line 269

Curl Options broken as array merge does not preserve keys

Issue Summary

I noticed some code I had depending on the sendgrid-php library suddenly started emitting output after a composer update. Turns out there's this code in Client.php

        curl_setopt_array($curl, array_merge([
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => 1,
            CURLOPT_CUSTOMREQUEST => strtoupper($method),
            CURLOPT_SSL_VERIFYPEER => false,
        ], $this->curlOptions));

array_merge does not maintain keys, therefore the curl constants do not get set on the merged options array and return transfer is therefore false i.e. curl emits its body text response as if it had been echo'd out.

Steps to Reproduce

  1. Perform any http request using library that has body content returned to client.

Technical details:

Tested on PHP7 with release sha#aa09fb89e2be2624de9db4dde914d27cbdece95c

Add a .codeclimate.yml file to this repo

It is possible to configure how CodeClimate looks at a repository.
These Docs explain how this is done. Please create an appropriate .codeclimate.yml for this repo. It should test the main language of the repo and run tests.

Add a USAGE.md file

Usage files are really nice when they exist in a repo, because it makes it really obvious where to look for information about how to use this tool. It can be frustrating when you expect this file to be there and it's not.
Please add a USAGE.md file, you can see an example of this
here

Please make sure you modify the file for this repo (hint: Most of this information should be in the README file)

Hacktoberfest: SendGrid Current Status

SendGrid DX team current status:

  • Wow
  • OMG
  • THANK YOU

Hacktoberfest 2017 has completely blown us away. We have had over 900 pull requests from over 300 contributors all in the last 30 days. That is more PRs than we normally get in 2 years!
We are actively working to review, comment, and/or merge as many PRs as we possibly can as quickly as we can.

We are currently working on “intaking” all the PRs that have come in, oldest first (we have about 400 remaining to go through). We are making sure that each PR we review is one we have a chance of merging - there have been a couple spammy items that came through. Due to the massive influx of requests so far, @thinkingserious and @mbernier have been working nights and weekends all month just to keep up! We’re not even mad, this is amazing!

Hey, that’s great for you - but what about my shirt!

If you have signed the CLA before 11/1, but haven’t had a PR merged yet, do not despair! We know we are behind on even just commenting on every PR to show you that we received it (something we typically do). If you submitted a mergeable (non-spam, actually adds value to the project) PR during October 2017, we will grant access to this page to redeem your shirt, sticker, and hacker pin. Next year, we will be sure to communicate this information sooner. We are sorry for any confusion we have caused. We appreciate those of you who have reached out to find out what’s going on!

What can I do to help move things along?

Have you signed the CLA yet?
We can only merge items from contributors who signed the CLA

Can you help another contributor?
If you can identify potential problems, add suggestions, or even leave a comment with your review of another PR (Looks good to me! Or I approve this change), that would help us review those PRs much faster, making it easier to get to your PR.

Do you even write tests, friend?
If you see a place where we could have a test to validate a piece of functionality, add it in. We know We know! It’s just another PR we have to review and merge. You’re right, it is! However, the more tests we have, the earlier our CI tool can catch issues, saving us a review as well as back and forth time.

@dhsrocha, @jmauerhan, @michaeljdennis, @micheleorselli, @misantron, @mptap, @nvzard, @pushkyn, @syedbilal5000, @thepriefy

Create first time contributor documentation

Issue Summary

Our open sourced documentation has a great first time contributor page that we wish to duplicate here.

Acceptance Criteria

  • We have a file in the root directory called first-timers.md or similar that helps a first time contributor make their first PR (please use our CONTRIBUTOR.md file for inspiration as well as this page)
  • We provide a link to tasks with the labels "difficulty: easy" and "status: help wanted" (example query) to all the repos listed here, please scroll to the bottom.

CONTRIBUTING refers to Python

Issue Summary

I am lazy and copy/pasted the Contributing guide from the python library.

Steps to Reproduce

  1. Go here and search "python". It just doesn't match PHP.

How to manually install sendgrid/php-http-client

I am unable to use the 'compose install' to install this or the sendgrid/sendgrid-php api. The sendgrid-php api had manual installation instructions, but this package does not.

Since this api is required for sendgrid/sendgrid-php would you please amend the installation instructions to also include a manual option, including a link to download this package, where is the best place to place the unzipped package, and the actual steps needed to manually install this package.

Thank you,
Howard Brown

Semantic versioning

Semantic versioning not (correctly) applied yet

Semantic versioning is handy for, you know, lots of reasons. See semver.org. Let's use it here too!

Background

Version 3.2.0 is not fully bc with 3.1.0, resulting in upgrade problems in, for instance, sendgrid/sendgrid-php. As long as these things can happen, specific versions have to be referenced in those library's composer.json file. It would be nice to freely be able to upgrade within major versions.

How do you guys think about this?

Add our Developer Experience Engineer career opportunity to the README

Issue Summary

The role of Developer Experience Engineer just became available and we want to announce it in the README. Here is the copy:

If you're a software engineer who is passionate about #DeveloperExperience and/or #OpenSource, this is an incredible opportunity to join our #DX team as a Developer Experience Engineer and work with @thinkingserious and @aroach! Tell your friends :)

Acceptance Criteria

  • The above announcement is added to the Announcements section of this README

There is no HTTP client

Issue Summary

I did not add an http client to this library

Steps to Reproduce

  1. This code will not do anything

Technical details:

  • php-http-client Version: the only version
  • PHP Version: 5-something

Change contactsdb to marketing api

Issue Summary

Contactsdb API considered to be legacy and doesn't work anymore, as per communication with support. Contactsdb methods should be replaced with marketing methods

Steps to Reproduce

  1. Try to make any action using contactsdb with full permissioned API key
  2. Receive 403
  3. Contact Sendgrid support to learn that contactsdb is deprecated

Technical details:

  • php-http-client Version: master (latest commit: [db6d34e])
  • PHP Version: 7.2

Remove cURL dependency

I'm using this indirectly through the sendgrid/sendgrid-php classes and on Windows, the cURL implementation doesn't access the certificates directly but rather needs an external file, whose location needs to be defined in the php.ini file.

Without that the sendgrid call silently fails (no exception, no warning etc.) and the HTTP return code is "0" with an empty body.

This is unacceptable. I fail to understand why curl is even needed at all. Creating an HTTP stream context and filling out the same information is rather trivial and works on all platforms without creating a dependency on cURL and the certificate file.

What's the rationale here?

Throwable is available starting with 7.0 PHP version

Issue Summary

According to composer.json, this library supports PHP version 5.6 and greater.

During review, my IDE warned that Throwable is used in file InvalidRequest. This interface is available since PHP 7.0.

Solution: bump PHP version requirement to '>=7.x' or replace Throwable using Exception.

Technical details:

  • php-http-client version: current master (according to composer.lock of other project: 3.10.6 / 2020-04-29T19:42:26+00:00)
  • php version: 7.1 (compatible version for configured phpunit)

Document and throw an error to help people with CURLOPT_SSL_VERIFYPEER issues

Issue Summary

If I try to send an email trough the sendgrid-php api I only get a timeout after a while, the email doesn't get send. There are no errors thrown. This issue happened after an update from version 3.9.0 to 3.9.1.

Steps to Reproduce

  1. Try to send a simple email (from the sendgrid-php repository for example)

Technical details:

  • php-http-client Version: 3.9.1 (commit 56d046a)
  • PHP Version: 7.1.15-1

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.