加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
auth.c 2.24 KB
一键复制 编辑 原始数据 按行查看 历史
刘煜 提交于 2024-03-11 16:05 . 增加语音识别示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //strdup
#include <curl/curl.h>
#include <cjson/cJSON.h>
#include "auth.h"
char* get_token(const char* ak, const char* sk)
{
char* token = NULL;
//保存响应报文,写入文件流时会自动分配内存空间
char* respdata = NULL;
size_t respsize = 0;
FILE* fp = open_memstream(&respdata, &respsize);
if (!fp)
{
perror("open_memstream");
return NULL;
}
CURL* client = curl_easy_init();
if (!client)
{
perror("curl_easy_init");
fclose(fp);
return NULL;
}
//设置URL
char* url = NULL;
asprintf(&url, "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s&", ak, sk);
curl_easy_setopt(client, CURLOPT_URL, url);
//将服务器返回的响应报文保存到文件流中
curl_easy_setopt(client, CURLOPT_WRITEDATA, fp);
//发送请求报文
CURLcode error = curl_easy_perform(client);
if (error != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform: %s\n", curl_easy_strerror(error));
fclose(fp);
free(url);
curl_easy_cleanup(client);
return NULL;
}
//关闭文件流之后才能访问内存中的数据
fclose(fp);
free(url);
curl_easy_cleanup(client);
//解析响应报文
cJSON* root = cJSON_Parse(respdata);
if (!root)
{
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL)
{
fprintf(stderr, "Error before: %s\n", error_ptr);
}
free(respdata);
return NULL;
}
cJSON* access_token = cJSON_GetObjectItem(root, "access_token");
if (!access_token)
{
fprintf(stderr, "access_token attribute not found\n");
free(respdata);
cJSON_Delete(root);
return NULL;
}
if (!cJSON_IsString(access_token))
{
fprintf(stderr, "access_token attribute format error\n");
free(respdata);
cJSON_Delete(root);
return NULL;
}
token = strdup(access_token->valuestring);
// 释放响应报文占用的内存
free(respdata);
// 删除解析后对象占用的内存
cJSON_Delete(root);
return token;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化