diff --git a/README.md b/README.md
index 46b97be4236a9f2316c97b47396187fbce2cb22b..7c6df8d5ab4463c59c1ad250383f63ac1d01529e 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,7 @@ pip install paddle-serving-server-gpu # GPU
```
You may need to use a domestic mirror source (in China, you can use the Tsinghua mirror source, add `-i https://pypi.tuna.tsinghua.edu.cn/simple` to pip command) to speed up the download.
-
+
Client package support Centos 7 and Ubuntu 18, or you can use HTTP service without install client.
Quick Start Example
@@ -256,6 +256,7 @@ curl -H "Content-Type:application/json" -X POST -d '{"url": "https://paddle-serv
### Developers
- [How to config Serving native operators on server side?](doc/SERVER_DAG.md)
- [How to develop a new Serving operator?](doc/NEW_OPERATOR.md)
+- [How to develop a new Web Service?](doc/NEW_WEB_SERVICE.md)
- [Golang client](doc/IMDB_GO_CLIENT.md)
- [Compile from source code](doc/COMPILE.md)
diff --git a/README_CN.md b/README_CN.md
index 4cafb499ee36168b93a244c66f7d5af4ea831160..e7f976098bf10476ed8bfb1d9d031ed4854acae6 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -262,6 +262,7 @@ curl -H "Content-Type:application/json" -X POST -d '{"url": "https://paddle-serv
### 开发者教程
- [如何配置Server端的计算图?](doc/SERVER_DAG_CN.md)
- [如何开发一个新的General Op?](doc/NEW_OPERATOR_CN.md)
+- [如何开发一个新的Web Service?](doc/NEW_WEB_SERVICE_CN.md)
- [如何在Paddle Serving使用Go Client?](doc/IMDB_GO_CLIENT_CN.md)
- [如何编译PaddleServing?](doc/COMPILE_CN.md)
diff --git a/doc/NEW_WEB_SERVICE.md b/doc/NEW_WEB_SERVICE.md
new file mode 100644
index 0000000000000000000000000000000000000000..63f62a774d914c7271bfed1508881e04f74f2ca8
--- /dev/null
+++ b/doc/NEW_WEB_SERVICE.md
@@ -0,0 +1,64 @@
+# How to develop a new Web service?
+
+([简体中文](NEW_WEB_SERVICE_CN.md)|English)
+
+This document will take the image classification service based on the Imagenet data set as an example to introduce how to develop a new web service. The complete code can be visited at [here](https://github.com/PaddlePaddle/Serving/blob/develop/python/examples/imagenet/image_classification_service.py).
+
+## WebService base class
+
+Paddle Serving implements the [WebService](https://github.com/PaddlePaddle/Serving/blob/develop/python/paddle_serving_server/web_service.py#L23) base class. You need to override its `preprocess` and `postprocess` method. The default implementation is as follows:
+
+```python
+class WebService(object):
+
+ def preprocess(self, feed={}, fetch=[]):
+ return feed, fetch
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ return fetch_map
+```
+
+### preprocess
+
+The preprocess method has two input parameters, `feed` and `fetch`. For an HTTP request `request`:
+
+- The value of `feed` is request data `request.json`
+- The value of `fetch` is the fetch part `request.json["fetch"]` in the request data
+
+The return values are the feed and fetch values used in the prediction.
+
+### postprocess
+
+The postprocess method has three input parameters, `feed`, `fetch` and `fetch_map`:
+
+- The value of `feed` is request data `request.json`
+- The value of `fetch` is the fetch part `request.json["fetch"]` in the request data
+- The value of `fetch_map` is the model output value.
+
+The return value will be processed as `{"reslut": fetch_map}` as the return of the HTTP request.
+
+## Develop ImageService class
+
+```python
+class ImageService(WebService):
+ def preprocess(self, feed={}, fetch=[]):
+ reader = ImageReader()
+ if "image" not in feed:
+ raise ("feed data error!")
+ if isinstance(feed["image"], list):
+ feed_batch = []
+ for image in feed["image"]:
+ sample = base64.b64decode(image)
+ img = reader.process_image(sample)
+ res_feed = {}
+ res_feed["image"] = img.reshape(-1)
+ feed_batch.append(res_feed)
+ return feed_batch, fetch
+ else:
+ sample = base64.b64decode(feed["image"])
+ img = reader.process_image(sample)
+ res_feed = {}
+ res_feed["image"] = img.reshape(-1)
+ return res_feed, fetch
+```
+
+For the above `ImageService`, only the `preprocess` method is rewritten to process the image data in Base64 format into the data format required by prediction.
diff --git a/doc/NEW_WEB_SERVICE_CN.md b/doc/NEW_WEB_SERVICE_CN.md
new file mode 100644
index 0000000000000000000000000000000000000000..e1a21d8a0e91a114c9d94b09ef0afa9a0d29de89
--- /dev/null
+++ b/doc/NEW_WEB_SERVICE_CN.md
@@ -0,0 +1,64 @@
+# 如何开发一个新的Web Service?
+
+(简体中文|[English](NEW_WEB_SERVICE.md))
+
+本文档将以Imagenet图像分类服务为例,来介绍如何开发一个新的Web Service。您可以在[这里](https://github.com/PaddlePaddle/Serving/blob/develop/python/examples/imagenet/image_classification_service.py)查阅完整的代码。
+
+## WebService基类
+
+Paddle Serving实现了[WebService](https://github.com/PaddlePaddle/Serving/blob/develop/python/paddle_serving_server/web_service.py#L23)基类,您需要重写它的`preprocess`方法和`postprocess`方法,默认实现如下:
+
+```python
+class WebService(object):
+
+ def preprocess(self, feed={}, fetch=[]):
+ return feed, fetch
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ return fetch_map
+```
+
+### preprocess方法
+
+preprocess方法有两个输入参数,`feed`和`fetch`。对于一个HTTP请求`request`:
+
+- `feed`的值为请求数据`request.json`
+- `fetch`的值为请求数据中的fetch部分`request.json["fetch"]`
+
+返回值分别是预测过程中用到的feed和fetch值。
+
+### postprocess方法
+
+postprocess方法有三个输入参数,`feed`、`fetch`和`fetch_map`:
+
+- `feed`的值为请求数据`request.json`
+- `fetch`的值为请求数据中的fetch部分`request.json["fetch"]`
+- `fetch_map`的值为fetch到的模型输出值
+
+返回值将会被处理成`{"reslut": fetch_map}`作为HTTP请求的返回。
+
+## 开发ImageService类
+
+```python
+class ImageService(WebService):
+ def preprocess(self, feed={}, fetch=[]):
+ reader = ImageReader()
+ if "image" not in feed:
+ raise ("feed data error!")
+ if isinstance(feed["image"], list):
+ feed_batch = []
+ for image in feed["image"]:
+ sample = base64.b64decode(image)
+ img = reader.process_image(sample)
+ res_feed = {}
+ res_feed["image"] = img.reshape(-1)
+ feed_batch.append(res_feed)
+ return feed_batch, fetch
+ else:
+ sample = base64.b64decode(feed["image"])
+ img = reader.process_image(sample)
+ res_feed = {}
+ res_feed["image"] = img.reshape(-1)
+ return res_feed, fetch
+```
+
+对于上述的`ImageService`,只重写了前处理方法,将base64格式的图片数据处理成模型预测需要的数据格式。