精华内容
下载资源
问答
  • 理解HTML HTTP API 和URL

    千次阅读 2020-05-06 11:07:15
    理解HTML HTTP URL和API 学习与网络编程相关或是python爬虫的时候,涉及到理解与互联网相关的一些概念,对这些概念理解的深度,最终决定了相关领域所能达到的高度。 HTML HTM(Hyper Text Marked Language),即超...

    理解HTML HTTP URL和API

    学习与网络编程相关或是python爬虫的时候,涉及到理解与互联网相关的一些概念,对这些概念理解的深度,最终决定了相关领域所能达到的高度。

    HTML

    HTM(Hyper Text Marked Language),即超文本标记语言。
    比较通俗的定义:网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。

    举个例子。在word文档里,我们可以编辑文字,图片,表格等等,可以对字体加粗、下划线。而在浏览器上我们如果想让编辑类似这样的效果该如何实现呢?就需要用到HTML语言。

    在word里我们是通过自己设置字体,排版等实现对文字的排版,而在浏览器上,我们根据HTML语言的规则,“设置”浏览器将要以什么样的形式呈现我们的内容。

    HTTP

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
    HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
    其中,‘请求’是指用户想服务器发起的资源请求,‘响应’是指服务器对用户的请求作出的响应,‘无状态’是指用户与服务器之间的这种连接是一次性的,服务器不保留与客户交易时的任何状态,第二次连接与第一次连接没有任何关系,‘应用层’是指HTTP协议位于应用层上,也就是架构在TCP协议上。

    简单来说,网络上的各种资源平时都存储在服务器(server)上,如果我们想要浏览网页,或者下载文件(获取资源–requset),是需要通过因特网向服务器申请,申请过程中的“申请表”就是HTTP协议,服务器根据我们的“申请表”决定要不要将资源返回给我们(响应responce)。

    在这里插入图片描述
    这张图很好的揭示了HTTP协议的工作流程。

    我们对HTTP协议的具体工作过程不做过多的阐述,忽略掉建立TCP连接这一步,重点来看看请求和响应的文件内容。

    http请求

    先看看申请表——HTTP请求中都需要哪些内容呢?
    http请求一般由三部分构成:<请求行><请求头><请求体>
    (1)请求行:
    GET http://localhost:2172/api/Default/GetUserInfo?UserName=Alan_beijing HTTP1.1

    HTTP协议对资源的操作方法(method)很多种,主要的方法如下所示:
    在这里插入图片描述
    通过url(资源的唯一标识符)和这些方法,HTTP协议可以对服务器上的这些资源进行操作,其中(GET、HEAD)是获取资源,(PUT POST PATCH DELETE)是对资源进行修改和删除。

    图解如下:
    在这里插入图片描述

    (2)请求头:header

    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding:gzip, deflate, br
    Accept-Language:zh-CN,zh;q=0.9
    Cache-Control:max-age=0
    Connection:keep-alive
    Host:localhost:2172
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
    

    看看请求头里都填写了哪些内容?
    在这里插入图片描述
    注意:header的格式一般是JSON格式。

    (3)请求体:Request-Body
    由于本示例使用的是Get请求,Get方法没有请求体。

    http响应

    再来看看服务器发给我们的“回执”包括哪些内容?
    http响应一般由三部分构成:<状态行><响应头><响应体>;

    状态行

    由三个部分构成:<协议及其版本><状态码><描述>,

    HTTP/1.1 200 OK;
    

    在这里插入图片描述
    简单理解,当状态码是200,表示请求成果,其他都是请求失败。

    响应头

    关于响应头,与请求头原理差不多,这里就不讲解了。

    Cache-Control:no-cache
    Content-Length:123
    Content-Type:application/xml; charset=utf-8
    Date:Sat, 27 Jan 2018 09:54:22 GMT
    Expires:-1
    Pragma:no-cache
    Server:Microsoft-IIS/10.0
    X-AspNet-Version:4.0.30319
    X-Powered-By:ASP.NET
    X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNcQWxhbl9iZWlqaW5nXHNvdXJjZVxyZXBvc1xIdHRwRGVtb1xIdHRwRGVtb1xhcGlcRGVmYXVsdFxHZXRVc2VySW5mbw==?=
    

    URL

    在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是WWW的统一资源定位标志,就是指网络地址。

    API

    应用程序接口(API)是基于编程语言构建的结构,使开发人员更容易地创建复杂的功能。它们抽象了复杂的代码,并提供一些简单的接口规则直接使用。

    简单的说,就是程序员A写了一个函数,程序员B想要直接使用而不再重写,就可以用程序员A提供的接口(API)来访问这个函数。

    the website is the api……
    比如说爬虫技术,就是将网站当做是api接口,进而获取数据。

    展开全文
  • Node.js之url模块之 WHATWG 标准的新 API

    千次阅读 2020-11-23 19:19:56
    在之前我们了解了url模块中传统的URL接口,那么本篇就去了解一下新的API接口。 Use of the legacy url.parse() method is discouraged. Users should use the WHATWG URL API. Because the url.parse() method uses...

    在之前我们了解了url模块中传统的URL接口,那么本篇就去了解一下新的API接口。

    URL 类

    new URL(input[, base])

    这个用于实例化 URL 对象,即将传入的 URL 字符串解析成 URL 对象。

    1. input:表示要解析的绝对或相对的 URL。如果 input 是相对路径,则需要 base。 如果 input 是绝对路径,则忽略 base。
    2. base:如果 input 不是绝对路径,则为要解析的基本 URL
    const url = require('url');
    const myURL = new URL('http://user:pass@host.com:8080/p/a/t/h?query=string#hash');
    console.log(myURL);
    

    解析成功之后返回的URL对象。这种方式获取的 URL 对象和传统方式获取的 URL 对象有些不同,大家可以自行对比。

    在这里插入图片描述

    URL类中的属性

    1. hash属性:获取及设置 URL 的片段部分。即 # 符号之后的内容
    2. host属性:获取及设置 URL 的主机部分。
    3. hostname属性:获取及设置 URL 的主机名部分。 url.host 和 url.hostname 之间的区别是 url.hostname 不包含端口。
    4. href属性:获取及设置序列化的 URL。即整个URL 字符串
    5. origin属性:获取只读的序列化的 URL 的 origin。
    6. username属性:获取及设置 URL 的用户名部分。
    7. password属性:获取及设置 URL 的密码部分。
    8. pathname属性:获取及设置 URL 的路径部分。
    9. port属性:获取及设置 URL 的端口部分。
    10. protocol属性:获取及设置 URL 的协议部分。
    11. search属性:获取及设置 URL 的序列化查询部分
    12. url.searchParams属性:获取表示 URL 查询参数的 URLSearchParams 对象。该属性属于只读属性,但是可以通过 search属性去修改

    URL类中的方法

    url.toString()

    返回序列化的 URL,返回值与 url.href 和 url.toJSON() 的相同。

    url.toJSON()

    返回序列化的 URL。返回值与 url.href 和 url.toString() 的相同。使用JSON.stringify() 序列化时将自动调用该方法。

    const myURL = new URL("http://user:pass@host.com:8080/p/a/t/h?query=string#hash");
    console.log(myURL.toString());
    console.log(JSON.stringify(myURL));
    

    URLSearchParams类

    URLSearchParams 类提供对 URL 查询部分的读写权限。这个类与 querystring 模块有相似的目的。这个类是专门为 URL 查询字符串而设计的。

    构造函数

    这个类有四个构造函数,用于不同的情况。

    1. new URLSearchParams():实例化一个新的空的 URLSearchParams 对象。
    2. new URLSearchParams(string):将 string 解析成一个查询字符串, 并且使用它来实例化一个新的 URLSearchParams 对象。 如果以 ‘?’ 开头,则忽略。
    3. new URLSearchParams(obj):通过使用查询哈希映射实例化一个新的 URLSearchParams 对象。 obj 的每一个属性的键和值都将被强制转换为字符串。
    4. new URLSearchParams(iterable):以一种类似于 Map 的构造函数的迭代映射方式实例化一个新的 URLSearchParams 对象。

    可以直接通过 URL 类的searchParams属性实例化URLSearchParams 类

    const myURL = new URL('https://example.org/?abc=123');
    console.log(myURL.searchParams.get('abc'));
    // 打印 123
    

    可以直接通过 URLSearchParams 类的构造函数实例化

    const myURL = new URL('https://example.org/?abc=123');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    // const newSearchParams = new URLSearchParams(myURL.search);
    

    方法

    1.urlSearchParams.append(name, value):在查询字符串中附加一个新的键值对。

    const myURL = new URL('https://example.org/?abc=123');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    newSearchParams.append("abc", "456");
    newSearchParams.append("type", "string")
    console.log(newSearchParams);
    //打印:URLSearchParams { 'abc' => '123', 'abc' => '456', 'type' => 'string' }
    

    在通过 append() 方法添加时,添加的键已经存在时,不会覆盖而是添加。

    2.urlSearchParams.delete(name):删除所有键为name的键值对。

    const myURL = new URL('https://example.org/?abc=123');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    newSearchParams.append("abc", "456");
    newSearchParams.append("type", "string")
    newSearchParams.delete('abc')
    console.log(newSearchParams);
    //打印:URLSearchParams { 'type' => 'string' }
    

    3.entries():在查询中的每个键值对上返回一个迭代器

    4.urlSearchParams.forEach(fn):在查询字符串中迭代每个键值对,并调用给定的函数

    const myURL = new URL('https://example.org/?abc=123');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    newSearchParams.forEach((value, name, searchParams) => {
        console.log(name, value, searchParams);
    });
    //打印:abc 123 URLSearchParams { 'abc' => '123' }
    

    通过 forEach() 方法循环得到键值对时,fn方法会返回三个参数,分别是:键、值、所有的键值对。

    5.get(name):返回键是name的第一个键值对的值。如果没有对应的键值对,则返回null。

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    console.log(newSearchParams.get('abc'));
    //打印:123  
    console.log(newSearchParams.get('ab'));
    //打印:null
    

    6.getAll(name):返回键是name的所有键值对的值,如果没有满足条件的键值对,则返回一个空的数组。

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    console.log(newSearchParams.getAll('abc'));
    //打印:[ '123', '456' ] 
    console.log(newSearchParams.getAll('ab'));
    //打印:[]
    

    7.has(name):如果存在至少一对键是 name 的键值对则返回 true

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    console.log(newSearchParams.has('abc'));
    //打印:true
    console.log(newSearchParams.has('ab'));
    //打印:false
    

    8.keys():返回每一个键值对上的键

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    console.log(newSearchParams.keys());
    //打印:URLSearchParams Iterator { 'abc', 'abc' }
    

    9.set(name, value):与 name 相对应的值设置为 value。如果已经存在键为 name 的键值对,则将第一对的值设为 value 并且删除其他对。 如果不存在,则将此键值对附加在查询字符串后。

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    newSearchParams.set('abc', '456');
    newSearchParams.set('ab', '456');
    console.log(newSearchParams.toString());
    //打印:abc=456&ab=456
    

    10.sort():按现有名称就地排列所有的名称-值对。

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    newSearchParams.set('abc', '456');
    newSearchParams.set('ab', '456');
    console.log(newSearchParams.toString());
    //打印:abc=456&ab=456
    newSearchParams.sort();
    console.log(newSearchParams.toString());
    //打印:ab=456&abc=456
    

    11.toString():返回查询参数序列化后的字符串

    12.values():返回每一个键值对上返回一个值

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    console.log(newSearchParams.values());
    //打印:URLSearchParams Iterator { '123', '456' }
    

    13.urlSearchParamsSymbol.iterator:返回一个键值对形式迭代器

    const myURL = new URL('https://example.org/?abc=123&abc=456');
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    for (let [key, value] of newSearchParams) {
        console.log(key + ": " + value);
    }
    //abc: 123
    //abc: 456
    

    url模块的两种使用API我们已经全部了解了一下,两种使用方法大同小异。但是WHATWG的API比传统的根据安全,所以我们推荐使用WHATWG的API

    展开全文
  • 远程服务器终端访问URL或者API

    千次阅读 2017-02-14 11:42:53
    使用curl命令,完整命令是curl + API或者URL (host : 端口  如果需要添加参数根据自己需求拼接好) 例如 curl http://127.0.0.1:8011/admin/op?opType=1&id=8099 curl http://www.cc.com:7086/admin/md5

    使用curl命令,完整命令是curl + API或者URL (host 端口  如果需要添加参数根据自己需求拼接好)  

    例如

    curl http://127.0.0.1:8011/admin/op?opType=1&id=8099


    curl http://www.cc.com:7086/admin/md5

    展开全文
  • 基于URL生成API Key方法

    千次阅读 2016-12-14 18:20:44
    今天师兄让我设计地图API Key的实现方法,看了一下google、百度地图的API,大概整理一下流程,因为在网上很难查到相关的资料,菜鸟拿出来大家分享一下。 1.  实现的前提 l  API Key与用户的帐户关联。 ² ...
    
    今天师兄让我设计地图API Key的实现方法,看了一下google、百度地图的API,大概整理一下流程,因为在网上很难查到相关的资料,菜鸟拿出来和大家分享一下。

    1.         实现的前提

    l         API Key与用户的帐户关联。

    ²        为了获取API调用者的信息,要确保API调用者在拥有了新浪账户之后才能够申请API Key

    l         API Key要映射到一个明确的域名与目录,这也就是说,如果一个API调用者想访问API,它要具备两个条件:

    ²        在进行服务请求的时候,API调用者要指定一个正确的API Key做为请求参数

    ²        调用者要在与API Key匹配的域名与目录中,假设这个Key是通过URLhttp://map.sina.com.cn/samples(包括了域名map.sina.com.cn与目录samples)来申请的。哪么,所有的来自这个URLAPI申请都能被通过,而来自其它URL的申请就不能用这个Key

    2.         实现方法

    要实现这个技术,首先你要生成并分发这些API Key,之后是你要验证通过这些Key来进行的API调用请求,下面我们来具体分析这两个模型:

    l         加密模式

    ²        通过一个Hash函数来生成一个API Key并分发出去,这里可以采用phpMhash实现,这个方法是一个单向的方法,只能通过一些数据来生成Key,而不能通过这个Key再还原出来这个数据。在这里,输入的数据就是URL

    ²        生成key时加一个TOKEN,这样更加不好逆转。

    l         验证模型

    ²        根据一个主机的调用请求HTTP referer+TOKENHTTP referer中含有发出请求的源URL)信息再生成一个Key,然后比较这个Key与用户有请求时写到参数中的哪个Key,如果验证匹配,哪么这个主机的请求将被响应。

     


    基于URL生成API <wbr>Key方法  

     

    3.         局限

    API Key来控制访问有一些局限,不过它能去除大量的非法API调用。

    l         HTTP referer很容易被伪造

    l         虽然从key中很难还原出原来数据(也就是URL),但也不是不可能的。就算我们用了MD5算法,并在Key中加入了TOKEN来增加还原的难度。

    4.         优势

    通过API KeyURL之间对应关系来限制你的API只能由某个特定的域名也目录来调用,也就是说,你可以指定哪个主机可以访问你的API。除此之外,这个技术还可以帮助你确定谁在用你的API,这样你就可以统计,在某段时间内,你的服务被调用多少次。

    5.         数据模型

    l         存在的问题?

    ²        是否加上限制机制?即,针对调用者的使用权限加以控制,在验证API Key的同时,验证KEY值是否过期,是否被强制锁定,是否需要续费等,这样的优势是对使用者的行为时可控的,劣势是每次验证都要访问数据库,降低验证的效率,增强数据库的压力。

    展开全文
  • Chrome查看API接口URL

    万次阅读 多人点赞 2020-01-30 20:43:03
    在一些需要工具等应用可能会应用到火车票信息的查询,但是又不知去哪里找即免费又不限制次数的Api接口,呵呵,今天我简单给你介绍一些Api接口的抓取,不要激动,最终还是希望可以帮助到你。对于有web开发经验的,可...
  • Java-通过URL来调用WebAPI

    千次阅读 2019-10-09 07:43:41
    title: Java 通过URL来调用WebAPI date: 2019-05-13 07:27:14 tags: API 什么是API API(Application programming interface)是一些预先定义的函数,无需理解内容细节,只需要根据协议调用即可。 个人理解 本文主要...
  • The requested URL xxx was not found on this server. 配置好lamp服务器,把项目放到服务器上,发现项目访问不了了,并提示:The requested URL xxx was not found on this server.。 错误原因: 新搭建的环境...
  • URL URI 区别

    万次阅读 2018-07-15 22:19:09
    URL URI 区别 本文我们讨论URL URI 的主要区别,并通过示例说明这些差异。 URL URI 直接差异来自其定义: Uniform Resource Identifier (URI) − 对任何抽象或物理资源进行完整标识的字符序列。 ...
  • 在线网址URL生成二维码的API接口

    千次阅读 2020-10-16 12:56:53
    url=网址 说明: w={数字} ,生成二维码的宽度; h={数字} ,生成二维码的高度; url={网址},要生成二维码的网址; 示例: http://pan.baidu.com/share/qrcode?w=145&h=148&url=wxp://f2f1aot1...
  • 问题描述 SonarQube 8.4.0版本,...Unknown url : /api/alm_settings/list 解决方案 已提交官方,官方给出恢复在下一个版本(8.4.1 release)会修复 影响范围 对功能无影响,放心使用其他功能,关掉弹层即可。 ...
  • 如何获得网站apiurl

    2017-08-13 07:09:05
    最近在学习“Python编程,从入门到实践”,里面有一章讲从GitHub的API上获取开源项目的信息,比如利用“https://api.github.com/search/repositories?q=language:python&sort=stars”就可以获得所有Python项目的信息...
  • 单个文件上传大小限制5MB,每次最多上传10张,支持多种图片链接格式和api接口调用。 获取令牌 注册账号并登录,点击User-Dashboard 点击API Token,点击Generate Secret Token 记住或复制你的令牌,上传图片的...
  • API中的url增加版本号

    千次阅读 2019-09-10 15:12:24
    1、定义注解:@ApiVersion @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface ApiVersion { /** * 标识版本号 * @return */ ...
  • WebApi获取请求url主机

    千次阅读 2016-10-31 13:20:00
    Url.Request.Headers.Host
  • 基于antd pro框架,配置接口apiUrl前缀

    千次阅读 2019-03-18 18:34:53
    基于antd-pro框架,配置package.json中的打包命令,实现不同环境使用不同的接口apiUrl前缀,避免人肉修改,保证各环境对应各自的api地址。 背景 这阵子,在玩antd-pro,感觉整体框架基本是一套很完善的管理系统,...
  • 开放API接口或URL链接给第三方使用

    千次阅读 2019-12-09 19:45:21
    使用场景 场景1 应用做到一定程度后,会有一些第三方用户或机构要对接部分的功能进入他们自己的应用。...2. 服务端提供一个API接口(如:getAccessToken),入参为:AppIDAppSecret,返回值为:token(to...
  • 一、豆瓣API简介及快速入门: 例如想获取ID为1220562的图书相关信息,则请求如下: http://api.douban.com/v2/book/1220562,返回的为json,其中的信息包括: id;alt/rating(评分)/author/image/title/summary...
  • 配置window.apiurl

    千次阅读 2015-11-11 10:23:35
    window.apiurl是在env.js中配置的, 在env.js文件中注意weinreUrl的用处。
  • 腾讯短网址(微信url.cn短链接)生成api接口是腾讯官方对外公开的短网址生成接口,可以将一个冗长的链接缩短成10个字符以内的短链接。 应用场景 腾讯短网址的应用场景很广,譬如短信营销、邮件推广、微信营销、...
  • Fetch API cannot load,URL scheme must be “http” or “https” for fan request 错误解决 这种问题是跨域资源共享问题,一般放生在做单纯的前端界面的时候,尤其是使用了vue.js或者其他的前端框架的时候。这个...
  • 举个例子就是将下面的地址 http://192.168.0.50/justlogapi/public/justlog/?service=UserControl_User.GetUserById&userId=1 路由成这样的地址 ... 该怎么做?ApacheNginx都可以
  • api和sdk有什么区别

    千次阅读 2020-07-24 11:53:59
    从事互联网行业,总会碰到两个词——SDK 和 API 。它们可是现在特别流行的好东西 API接口,根据接口文档和自己的APP进行...就相当于很多API和其他文件的集合体,你可以用这个完成某一个事情。 API: 概念:API(Applica
  • 短网址生成api接口有很多种,不同的接口生成的短网址格式也不同,比如常见的t.cn、url.cn、w.url.cn等格式。总而言之短链接接口就是用来将一个冗长的链接缩短成15个字符以内的短链接。 应用场景 短网址的应用场景...
  • Web API规范设计指引

    千次阅读 2018-12-25 14:34:06
    注:Web URL和API URL的规范是不同的。 header 如果不用RESTful,最好也不要把参数放到header里,尽量在HTTP协议框架内实现业务。在此前提下,如果存在(所有接口都需要的)公共参数,可以放在URL query里;或者最...
  • 是因为vscode更新的问题, 启动conda的时候,conda自己会检查内置软件的更新,由于打不开vscode的官网会导致获取链接的失败。 使用 anconda-promt 输入anaconda-navigator,可以从控制台查看具体的错误日志。...
  • nodejs: url模块已过期,推荐使用URL

    千次阅读 2021-02-05 15:30:46
    对于一个url: const urlStr = "https://m.shop.com/home/share?id=4433&...import url from 'url'; import qs from 'querystring' const url = url.parse(urlStr) const query = qs.parse(url.que
  • 1、我在 springboot项目中的 application.properties 配置文件中 server.servlet.context-path=/community 配置改成 ...erver.servlet.context-path=/community/api,导致如下情况 转存失败重新上传取消 ...
  • 在实际编写接口的过程中难免有一些特殊的接口,比如动态参数接口,以“JTT1078-2016道路运输车辆卫星定位系统视频通信协议(扫描版)”中的HTTP URL服务要求为例,截图如下:定义API接口请求方式using System;...
  • 在spring boot中使用restAPI风格调用接口,参数出现带点的数据,比如: http://xxxx:8000/test/xxx.yyy.zzz 在java后端接收的时候,代码如下: @RequestMapping(value = "/test/{xxx}", method = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 908,302
精华内容 363,320
关键字:

url和api