【发布时间】:2021-06-22 12:35:43
【问题描述】:
我是 GraphQL 新手,需要编写一个 Python 函数来更新 2 个 ID 类型(videoId 和 trackId)作为变量,每个变量的数量为 10。它们存储在mapped_ids 列表中,该列表由以下形式的 10 个元组组成:('video ID', 'track ID')。
我的目标是编写一个函数,为我在mapped_ids 列表中获得的 10 个 ID 对中的每一个更新查询变量。所以基本上,每个视频都应该得到一个单独的请求,包括视频 ID 和轨道 ID。
使用我当前的方法(位于下面代码的最后),变量总是被覆盖,这就是为什么只考虑mapped_ids 列表的最后一个 ID 对的原因。使用一对 ID,我的代码就可以工作。
我的代码:
import requests
endpoint = 'endpoint of your choice'
# Query containing video and track ID of German track as variables.
GET_TRACK_URLS = '''
query GetUrls($id: ID!, $trackId: ID!) {
video(id: $id) {
id
voices {
id
dubbingSegments {
start
duration
meta(trackId: $trackId) {
text
trackId
asset {
representations {
href
}
}
}
}
}
}
}
'''
# POST GraphQL request and parse response.
def run_query(query, variables):
response = requests.post(
endpoint,
json={'query': query, 'variables': variables},
)
if response.status_code == 200:
return response.json()
else:
raise Exception(f'Query failed with a {response.status_code}: {response.json()}')
# Approach 1 to update variables (not successful so far):
for video_id, track_id in mapped_ids:
video_id = video_id
track_id = track_id
data2 = run_query(GET_TRACK_URLS, {'id': video_id, 'trackId': track_id})
# Approach 2 to update variables (not successful so far):
my_variables = {}
for video_id, track_id in mapped_ids:
my_variables['id'] = video_id
my_variables['trackId'] = track_id
data2 = run_query(GET_TRACK_URLS, my_variables)
不幸的是,尽管我已经做了很多研究,但我还是无法全神贯注地编写所需的函数。
JSON 响应示例:
{'data': {'video': {'id': 'c0deeabc-6b12-11eb-b741-7b3016ed7f39', 'voices': "
"[{'id': '745b74d0-7b48-11eb-9e5f-7fc87d0ed7ca', 'dubbingSegments': "
"[{'start': 140, 'duration': 3539, 'meta': [{'text': 'Heute geht es bei uns "
"um Reptilien.', 'trackId': '9mn86640-87c0-11eb-a09e-ad706c66b842', 'asset': "
"{'representations': [{'href': "
"'https://arbitraryurl.com/5dbb3m88-87c0-11eb-a09e-ad741a76b842/original?av=1'}]}}]}, "
"{'start': 3700, 'duration': 6469, 'meta': [{'text': 'Im Gegensatz zu "
'Säugetieren, Amphibien, Vögeln und Fischen, die wir bereits behandelt '
"haben,', 'trackId': '7bn86640-80c0-11eb-a09e-ad706a76b851', 'asset': "
"{'representations': [{'href': "
"'https://arbitraryurl.com/5daa1l79-87c0-11eb-a09e-ad706m16b842/original?av=1'}]}}]}, "
"{'start': 10170, 'duration': 3099, 'meta': [{'text': 'haben Reptilien "
"außergewöhnliche Schuppen.', 'trackId': "
"'5da82140-87c0-11bm-a09e-ad706a76b842', 'asset': {'representations': "
"[{'href': "
"'https://arbitraryurl.com/5daa5341-87c0-11eb-a09e-ad706a76b842/original?av=1'}]}}]},
编辑:
在考虑了 Bijay Regmi 的解决方案后,如果我打印出来,我的代码和查询现在看起来像这样:
for elem in mapped_ids:
query_string = GET_TRACK_URLS.replace('(id: $id)','(id: "' + elem[0] + '")')
query_string = query_string.replace('(trackId: $trackId)', '(trackId: "' + elem[1] + '")')
print(query_string)
data = run_query(GET_TRACK_URLS, {})
print('\nDATA:\n', data) # Debug.
query GetUrls($id: ID!, $trackId: ID!) {
video(id: b8bce3e0-6b84-18jb-b741-7b3016ed7f01) {
id
voices {
id
dubbingSegments {
start
duration
meta(trackId: 5bv76640-09c0-11eb-a09e-ad706a76b873) {
text
trackId
asset {
representations {
href
}
}
}
}
}
}
}
现在我收到错误消息:
Exception: Query failed with a 400:
{'errors': [{'message': 'Variable "$id" of required type "ID!" was not provided.',
'locations': [{'line': 2, 'column': 15}], 'extensions': {'code': 'INTERNAL_SERVER_ERROR'}},
{'message': 'Variable "$trackId" of required type "ID!" was not provided.', 'locations': [{'line': 2, 'column': 25}], 'extensions': {'code': 'INTERNAL_SERVER_ERROR'}}]}
【问题讨论】:
-
你能发布一个响应json的样本吗?
-
@BijayRegmi 当然,我刚刚添加了请求的样本。我希望这会有所帮助。
-
那么您基本上是想更新
GET_TRACK_URLS中的那些id 并获取内容? -
是的,我想编写一个函数来更新
GET_TRACK_URLS中的 id 和 trackId 变量,这样我就可以轻松运行几次一百首曲目。
标签: python-3.x graphql