东营网站建设规划书,智能建站系统个人网站,蚌埠北京网站建设,做设计有哪些接私活的网站前言 GraphQL 是一种用于 API 的查询语言#xff0c;是由 Facebook 开源的一种用于提供数据查询服务的抽象框架。在服务端 API 开发中#xff0c;很多时候定义一个接口返回的数据相对固定#xff0c;因此要获得更多信息或者只想得到某部分信息时#xff0c;基于 RESTful AP…前言 GraphQL 是一种用于 API 的查询语言是由 Facebook 开源的一种用于提供数据查询服务的抽象框架。在服务端 API 开发中很多时候定义一个接口返回的数据相对固定因此要获得更多信息或者只想得到某部分信息时基于 RESTful API 的接口就显得不那么灵活。而 GraphQL 对 API 中的数据提供了一套易于理解的完整描述使得客户端能够准确地获得它需要的数据而且没有任何冗余也让 API 更容易地随着时间推移而演进还能用于构建强大的开发者工具。 目前LeetCode 和 GitHub 都借助 GraphQL 来设计提供了更大的灵活性对于想借助 GitHub 来了解 GraphQL 可直接访问 GraphQL API v4 或者参考 GraphQL 实战Github V4 API使用。而对于在 LeetCode 上使用 GraphQL 查询相对资料少一些因此在这我主要以 LeetCode 为例来做讲解其实是因为自己业余刷题时突发奇想想写一个爬虫。 过程 如果直接搜索以 Java 语言为载体的 GraphQL 的话一大部分搜索结果都是介绍使用 graphql-java 来搭建查询服务而我们的目的是利用 GraphQL 来获取想要的数据并非自己搭建一个查询服务因此如果一开始就选错了工具就会导致后面的方向都是错误的。 以 LeetCode 第一题 1.Two Sum 为例获取其后端发送过来的数据。利用 F12 功能调出如下界面选 Network 找到 graphql 文件有好多 graphql 文件可以依次点击查找自己想要的那个这里找到包含有题目信息的从 preview 中我们可以看到 data 返回了题目相关的信息 那么如何构造 GraphQL Query 来获取信息呢从 Header 中的 Request Payload 中我们可以看到一个query的字段这是我们要构造的 GraphQL Query 的一个重要信息。 我们并不一开始就用代码来获取题目信息而是先利用 Postman 来看看如何获取题目信息。右键 Network 下的 graphql 文件—Copy—Copy as cURL(bash)如下图所示 之后打开 Postman—左上角Import—Paste Raw Text粘贴从 Body中可以看到构造好了的 GraphQL Query 与我们在 Request Payload 中看到的 query 的字段相仿因为有一点需要更改的细节 当然如果不想直接粘贴复制的 cURL那么我们可以自己在 Postman 中写 Header 和 Body需要注意的是这边的 Content-Type是application/graphqlBody 中的 GraphQL 构造参照 Request Payload 中的query的字段来构造 获取到的结果如下 我们在实际中可能并不需要提供的所有信息只想要某一部分那么只需更改query即可这也是 GraphQL 的强大之处。比如我们只想要题目的content信息那么其query则为 query{question(titleSlug:two-sum) {content}}
复制代码代码 在上边已经利用 Postman 查询到想要的数据了而现在我们要做的就是用代码将上述操作展示出来。这边使用 OkHttp 来进行题目信息获取。 import okhttp3.*;
import org.jsoup.Connection;
import org.jsoup.Jsoup;import java.io.IOException;
import java.util.Map;import static java.lang.System.out;public class Question {public static void main(String... args) throws IOException {String questionUrl https://leetcode.com/problems/two-sum/description/;String graphqlUrl https://leetcode.com/graphql;Connection.Response response Jsoup.connect(questionUrl).method(Connection.Method.GET).execute();MapString,Stringcookies response.cookies();for (Map.EntryString,Stringentry:cookies.entrySet()){//out.println(entry.getKey() : entry.getValue());}String csrftoken response.cookie(csrftoken);String __cfduid response.cookie(__cfduid);OkHttpClient client new OkHttpClient.Builder().followRedirects(false).followSslRedirects(false).build();String postBody query{\n question(titleSlug:\two-sum\) {\n content\n }\n }\n;Request request new Request.Builder().addHeader(Content-Type,application/graphql).addHeader(Referer,questionUrl).addHeader(Cookie,__cfduid __cfduid ; csrftoken csrftoken).addHeader(x-csrftoken,csrftoken).url(graphqlUrl).post(RequestBody.create(MediaType.parse(application/graphql; charsetutf-8),postBody)).build();Response response1 client.newCall(request).execute();//out.println(response1.headers());out.println(response1.body().string());}
}
复制代码执行结果