以LeetCode为例重庆幸运农场——如何发送GraphQL Query获取数据

前言
GraphQL 是一种用于 API 的查询语言重庆幸运农场QQ2952777280【话仙源码论坛】hxforum.com【木瓜源码论坛】papayabbs.com ,是由 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/graphql,Body 中的 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();

    Map<String,String>cookies = response.cookies();
    for (Map.Entry<String,String>entry: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; charset=utf-8"),postBody))
            .build();

    Response response1 = client.newCall(request).execute();
    //out.println(response1.headers());
    out.println(response1.body().string());

}

}
执行结果:

┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆   ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆   ┆ 大 ┆   ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆   ┆ 来 ┆   ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆   ┆ 雁 ┆   ┆ 终 ┆ 而 ┆
┆   ┆ 暖 ┆   ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆   ┆ 也 ┆   ┆ 我 ┆   ┆ 的 ┆ 有 ┆ 精 ┆   ┆ 也 ┆   ┆ 没 ┆ 你 ┆
┆   ┆ 这 ┆   ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆   ┆ 会 ┆   ┆ 在 ┆   ┆ 清 ┆ 来 ┆ 准 ┆   ┆ 没 ┆   ┆ 有 ┆ 没 ┆
┆   ┆ 生 ┆   ┆ 探 ┆   ┆ 最 ┆ 避 ┆   ┆ 在 ┆   ┆ 这 ┆   ┆ 晨 ┆   ┆ 的 ┆   ┆ 有 ┆   ┆ 来 ┆ 有 ┆
┆   ┆ 之 ┆   ┆ 般 ┆   ┆ 不 ┆   ┆   ┆ 这 ┆   ┆ 里 ┆   ┆ 没 ┆   ┆ 杀 ┆   ┆ 来 ┆   ┆   ┆ 来 ┆

原文地址:http://blog.51cto.com/13879155/2147665

时间: 2024-08-29 23:24:56

以LeetCode为例重庆幸运农场——如何发送GraphQL Query获取数据的相关文章

以LeetCode为例——如何发送GraphQL Query获取数据

前言 ??GraphQL 是一种用于 API 的查询语言,是由 Facebook 开源的一种用于提供数据查询服务的抽象框架.在服务端 API 开发中,很多时候定义一个接口返回的数据相对固定,因此要获得更多信息或者只想得到某部分信息时,基于 RESTful API 的接口就显得不那么灵活.而 GraphQL 对 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具. ??目前,L

用netty造一个简易的fiddler ( 一 生成证书重庆幸运农场 )

本人曾在上一家公司,搞过半年的爬虫.因此认识了这个叫 fiddler 的工具.当然市面上还有 charles ,开源也有 anyproxy whistle.到最后我还是喜欢用fiddler.似乎有点念旧.而现在这家公司是做erp的.项目用到了netty. 因此才有这个念头.造一个简单的轮子-简易的fiddler Fiddler是一个http协议调试代理工具重庆幸运农场 QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com,它能够记录并检查所有你

python如何帮我在重庆幸运农场投资中获取更高收益

搞技术的大都比较纯粹,比较实在,除了工资之外基本就没有别的收入了(少部分人能接外包赚外块).或许是迫于生活的压力,或许是不甘于固定的工资,或许是出于技术人骨子里的好奇,亦或是这几年关于理财投资的大力宣传.门槛降低,理财越来越被我们所接受,并开始尝试股票.基金.P2P.XX宝等各种理财产品,本文所讲与P2P有关,但不打广告,只讲技术,顺便说明:投资有风险,理财需谨慎,我们赚钱不容易,不能给打了水漂. 背景介绍某公司的理财产品有如下特点: 公司分别有12,18,24,36个月的固定期限理财产品,期限

TCP编程例三:从客户端发送文件给服务器端,服务器端保存到本地,并返回“发送成功”给客户端。

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.

Python爬虫爬取OA幸运飞艇平台获取数据

安装BeautifulSoup以及requests 打开window 的cmd窗口输入命令pip install requests 执行安装,等待他安装完成就可以了 BeautifulSoup库也是同样的方法 我使用的编译器的是sublime text 3,觉得是挺好用的一个编译软件 其他工具: Chrome浏览器 Python版本: Python3.6 运行平台: Windows 1.首先我们搜索OA幸运飞艇平台排行榜:[×××.com/h5]企 娥:217 1793 408获取网页的代码:

一个存储和转发http数据接口的样例。基于SP或MM计费或用户注册数据接口。

下载https://github.com/soybean217/demo-forwarding Introduction 简介 A demo for store and forwarding http data . Base SP or MM fee or user register interface . Structure 结构 demo-base,公共功能包. demo-interface,HTTP数据接收存储接口工程.interface web project . demo-admin,

python xlrd xlwt获取数据到execl表格样例

import mock #coding:gbkfrom xlrd import open_workbookimport mockimport xlrdimport xlwtfrom xlutils.copy import copyimport osacct = mock.acct_iddata = mock.acct_datastart_time = mock.start_timeprint start_timeend_time = mock.end_time5haoshi = mock.res

OA系统信用盘新增三个极速彩版本

OA系统信用盘新增三个极速彩版本程序源码参数说明: QQ 2952777280 运行环境:php5.2+mysql 源码类别:时时彩(彩票)现金网系统/两面盘 界面语言:繁体中文 源码授权:无加密文件及认证授权,永久性可直接使用. 版本支持:PC/WAP网页版 编程语言:PHP OA系统信用盘新增三个极速彩版本自带系统彩票游戏:极速赛车.极速时时彩.极速飞艇.北京赛车(PK10).重庆时时彩.新疆时时彩.天津时时彩.广东快乐十分.重庆幸运农场.北京快乐8.江苏骰宝(快3).幸运飞艇. 名称 下载

AFNetworking 3.0迁移指南

AFNetworking是一款在OS X和iOS下都令人喜爱的网络库.为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持.如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本.本指南将引导您完成这个过程. 本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,并且解释了新增和更改的设计结构. 新设备要求: iO