使用MongoDB Atlas的GraphQL API,在浏览器上执行查询

首先

我已经为在MongoDB Atlas上配置的GraphQL应用程序添加了设置,以使其可以从浏览器中进行搜索。

 

要让外部访问MongoDB Atlas上的GraphQL应用程序,需要进行访问权限和认证设置。特别是,如果要直接从浏览器发送查询,则需要使用Bearer认证以避免CORS错误。

我們參考了以下關於MongoDB Atlas的Bearer認證資料。

 

设置访问权限

由于默认情况下不允许访问外部数据,因此对于公开的应用程序数据,至少需要允许读取。

image.png
image.png
image.png

設定認證

    从左侧面板选择身份验证。在右侧会显示身份验证提供者的界面,然后点击API密钥的编辑按钮。
image.png
    为了启用Provider Enabled并保存设置,请点击“保存草稿”按钮。在此时,即使点击“创建API Key”,API Key也不会被创建。
image.png
image.png

请从浏览器中进行操作验证。

利用Bearer認证的方法,从浏览器向MongoDB Atlas发送请求。执行以下两个步骤:

    • アクセストークンの取得

 

    取得したアクセストークンをヘッダに指定してクエリを送信

取得的访问令牌有效期为30分钟。

获取访问令牌
需要在访问令牌获取的URL中设置应用程序ID。可以从MongoDB Atlas应用程序的设置页面获取应用程序ID。

image.png

【获取访问令牌的URL格式】

https://realm.mongodb.com/api/client/v2.0/app/<APPID>/auth/providers/api-key/login

以JSON格式发送请求。对于密钥,请指定之前在认证设置中记下的API密钥。
【发送位置】

	fetch('https://realm.mongodb.com/api/client/v2.0/app/webcamql-qrkjj/auth/providers/api-key/login', {
  		method: 'POST',
  		headers: {
    		'Content-Type': 'application/json'
  		},
  		body: JSON.stringify({
    		"key": "mfRX9eCxzDFg91YVtcQ75ZIhgnZItcG49Gg8lndtQO5kOBq0Ok9tqj2qLvflljp7"
 		})
	})
	.then(response => response.json())
	.then(data =>{
		authToken = data.access_token; 
		console.log(data);
	}).catch(error => console.error(error));

当发送请求后,会收到以下类型的结果,将access_token保存在变量中。
【接收数据示例】

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RldmljZV9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhYXNfZG9tYWluX2lkIjoiNjQ1NjRkNjc3ZmZmMzU3YjljNjc1ZWEyIiwiZXhwIjoxNjgzNDI5ODAyLCJpYXQiOjE2ODM0MjgwMDEsImlzcyI6IjY0NTcxMmExODA1NmMwM2I5YmI0ZmIyMyIsInN0aXRjaF9kZXZJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInN0aXRjaF9kb21haW5JZCI6IjY0NTY0ZDY3N2ZmZjM1N2I5YzY3NWVhMiIsInN1YiI6IjY0NTZmODgwOWUwOTJjYmY1ZjM5YTM5ZCIsInR5cCI6ImFjY2VzcyJ9.GRafD4p7NTgPawQTdKEpDUXIW5EkZ7pw9wRMaLglJos",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RhdGEiOm51bGwsImJhYXNfZGV2aWNlX2lkIjoiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiYmFhc19kb21haW5faWQiOiI2NDU2NGQ2NzdmZmYzNTdiOWM2NzVlYTIiLCJiYWFzX2lkIjoiNjQ1NzEyYTE4MDU2YzAzYjliYjRmYjIzIiwiYmFhc19pZGVudGl0eSI6eyJpZCI6IjY0NTZmODgxOWUwOTJjYmY1ZjM5YTNhMiIsInByb3ZpZGVyX3R5cGUiOiJhcGkta2V5IiwicHJvdmlkZXJfaWQiOiI2NDU2NGQ2NzdmZmYzNTdiOWM2NzVlOWUifSwiZXhwIjoxNjg4NjEyMDAxLCJpYXQiOjE2ODM0MjgwMDEsInN0aXRjaF9kYXRhIjpudWxsLCJzdGl0Y2hfZGV2SWQiOiIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCJzdGl0Y2hfZG9tYWluSWQiOiI2NDU2NGQ2NzdmZmYzNTdiOWM2NzVlYTIiLCJzdGl0Y2hfaWQiOiI2NDU3MTJhMTgwNTZjMDNiOWJiNGZiMjMiLCJzdGl0Y2hfaWRlbnQiOnsiaWQiOiI2NDU2Zjg4MTllMDkyY2JmNWYzOWEzYTIiLCJwcm92aWRlcl90eXBlIjoiYXBpLWtleSIsInByb3ZpZGVyX2lkIjoiNjQ1NjRkNjc3ZmZmMzU3YjljNjc1ZTllIn0sInN1YiI6IjY0NTZmODgwOWUwOTJjYmY1ZjM5YTM5ZCIsInR5cCI6InJlZnJlc2gifQ.ZPSxBnFpyxDy4smwEfRK_pKOzasP8m1NaH-QbBdsStI",
    "user_id": "6456f8809e092cbf5f39a39d",
    "device_id": "000000000000000000000000"
}

2. 发送查询
将获取到的访问令牌指定到头部,然后发送查询。发送的目标端点可从Mongodb Atlas的应用程序设置页面中获取。

image.png

使用Bearer <访问令牌> 将Authorization头设置为请求并发送到端点。以json格式接收结果。

【查询发送部分】 ̄ry

	fetch('https://realm.mongodb.com/api/client/v2.0/app/webcamql-qrkjj/graphql', {
  		method: 'POST',
  		headers: {
			'Authorization': 'Bearer ' + authToken  ,
    		'Content-Type': 'application/json'
  		},
  		body: JSON.stringify({
    		query: queryMsg
  		})
	})
	.then(response => response.json())
	.then(data =>{ 
		console.log(data);
		document.getElementById("result").innerHTML=JSON.stringify(data);
	})
	.catch(error => console.error(error));

请参考查询的内容。

	let queryMsg = `query {
  		webcams(query:{id_lte:"1059100000"}
  		,limit:5
    	,sortBy:ID_ASC) {
			id
			status
			title
    		location{
     		 	latitude
      			longitude
    		}
  		}
	}`

【GraphQL确认用代码全文】

<html>
<body onload="getAuthenticate()">
<button type="button" onclick="getWebCamList();">TEST</button>
<div id="result"></div>
<script>
var authToken = "";
function getAuthenticate(){

	fetch('https://realm.mongodb.com/api/client/v2.0/app/webcamql-qrkjj/auth/providers/api-key/login', {
  		method: 'POST',
  		headers: {
    		'Content-Type': 'application/json'
  		},
  		body: JSON.stringify({
    		"key": "mfRX9eCxzDFg91YVtcQ75ZIhgnZItcG49Gg8lndtQO5kOBq0Ok9tqj2qLvflljp7"
 		})
	})
	.then(response => response.json())
	.then(data =>{
		authToken = data.access_token; 
		console.log(data);
	}).catch(error => console.error(error));
}

function getWebCamList(){
	let queryMsg = `query {
  		webcams(query:{id_lte:"1059100000"}
  		,limit:5
    	,sortBy:ID_ASC) {
			id
			status
			title
    		location{
     		 	latitude
      			longitude
    		}
  		}
	}`;

	fetch('https://realm.mongodb.com/api/client/v2.0/app/webcamql-qrkjj/graphql', {
  		method: 'POST',
  		headers: {
			'Authorization': 'Bearer ' + authToken  ,
    		'Content-Type': 'application/json'
  		},
  		body: JSON.stringify({
    		query: queryMsg
  		})
	})
	.then(response => response.json())
	.then(data =>{ 
		console.log(data);
		document.getElementById("result").innerHTML=JSON.stringify(data);
	})
	.catch(error => console.error(error));
}
</script>
<body>
</html>

最后

MongoDB Atlas提供了从界面上进行设置的功能,可以使用各种不同的功能,但由于可用功能太多,要完全掌握使用方法可能会有些困难。

广告
将在 10 秒后关闭
bannerAds