> For the complete documentation index, see [llms.txt](https://flask-yushu.gitbook.io/yushu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://flask-yushu.gitbook.io/yushu/2.-sou-suo-shu-ji-lu-you-bian-xie/2.4-requests-vs-urllib.md).

# 2.4 requests vs urllib

发送http请求的两种方法： 1.使用urllib(python内置) 2.使用requests（需要使用pip3安装）

urllib的用法： ![urllib的用法](https://upload-images.jianshu.io/upload_images/7220971-8b3d328f484a7fcd.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240) urlib的一些缺点： 1.需要对url进行编码，并且有些字符不需要编码还要声明出来 2.返回的结果是字节码，需要包装成字符串 3.404的情况是通过异常的形式抛出，现在流行的restful，404已经不是一种异常了

## 5.从API获取数据

将具体调用HTTP请求，获取结果的业务代码封装到YuShuBook中

```
class YuShuBook:

    search_by_isbn_url = "http://t.yushu.im/v2/book/search/isbn/{}"

    search_by_key_url = "http://t.yushu.im/v2/book/search?q={}&count={}&start={}"

    @classmethod
    def search_by_isbn(cls, isbn):
        url = cls.search_by_isbn_url.format(isbn)
        return HTTP.get(url)

    @classmethod
    def search_by_key(cls, q, count=15, start=0):
        url = cls.search_by_key_url.format(q, count, start)
        return HTTP.get(url)
```

使用json.dumps 序列表返回结果，在视图函数中进行返回，并声明状态码和返回类型(一个元组)

```
@app.route("/book/search/<q>/<page>")
def search(q, page):
    """
    搜索书籍路由
    :param q: 关键字 OR isbn
    :param page: 页码
    """
    isbn_or_key = is_isbn_or_key(q)
    if isbn_or_key == 'isbn':
        result = YuShuBook.search_by_isbn(q)
    else:
        result = YuShuBook.search_by_key(q)

    return json.dumps(result), 200, {'content-type': 'application/json'}
```

可以使用flask提供的jsonify替换麻烦的json.dumps和元组

```
    return jsonify(result)
```
