c++ curl实现post请求 - 随机获取网易云音乐热门歌曲接口

随机获取网易云音乐热门歌曲接口

接口地址: https://api.66mz8.com/api/rand.music.163.php

返回格式: get/post

请求方式: json/mp3

请求示例: https://api.66mz8.com/api/rand.music.163.php?format=json

请求参数说明:

 名称必填类型说明
 formatstring选择输出格式 [json|mp3]

返回参数说明:

 名称类型说明
 codestring返回的状态码
 msgstring返回提示信息

请求返回示例:

{
  "code": 200,
  "name": "凉城",
  "artists_name": "任然",
  "music_url": "http:\/\/music.163.com\/song\/media\/outer\/url?id=442314991.mp3",
  "music_pic": "http:\/\/p1.music.126.net\/9RQepityGQUfi5Rbcz7xCQ==\/18747772766555079.jpg"
}
#include <iostream>
#include <curl/curl.h>
#include <json/json.h>
#include <String>
#pragma warning(disable:4996)
using namespace std;
 


wchar_t *utf_8ToUnicode(const char *u8s)
{
	int wcsLen = MultiByteToWideChar(CP_UTF8, NULL, u8s, strlen(u8s), NULL, NULL);
	wchar_t *wcString = new wchar_t[wcsLen + 1];
	MultiByteToWideChar(CP_UTF8, NULL, u8s, strlen(u8s), wcString, wcsLen);
	wcString[wcsLen] = '\0';
	return wcString;
}
char *unicodeToAnsi(wchar_t *wcString)
{
	int len = WideCharToMultiByte(CP_ACP, NULL, wcString, -1, NULL, NULL, NULL, NULL);
	char *str = new char[len];
	WideCharToMultiByte(CP_ACP, NULL, wcString, -1, str, len, NULL, NULL);
	return str;
}

static void UTF8toANSI(char *strUTF8, char*out_ansi)
{
	//获取转换为多字节后需要的缓冲区大小,创建多字节缓冲区
	UINT nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, NULL, 0);
	LPWSTR wszBuffer = (LPWSTR)malloc((nLen + 1) * sizeof(WCHAR));
	nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, wszBuffer, nLen);
	wszBuffer[nLen] = 0;
	nLen = WideCharToMultiByte(936, 0, wszBuffer, -1, NULL, 0, NULL, NULL);
	nLen = WideCharToMultiByte(936, 0, wszBuffer, -1, out_ansi, nLen, NULL, NULL);
	out_ansi[nLen] = 0;
}


wstring AsciiToUnicode(const string& str)
{
	// 预算-缓冲区中宽字节的长度  
	int unicodeLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);
	// 给指向缓冲区的指针变量分配内存  
	wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
	// 开始向缓冲区转换字节  
	MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, pUnicode, unicodeLen);
	wstring ret_str = pUnicode;
	free(pUnicode);
	return ret_str;
}

string UnicodeToUtf8(const wstring& wstr)
{
	// 预算-缓冲区中多字节的长度  
	int ansiiLen = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
	// 给指向缓冲区的指针变量分配内存  
	char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
	// 开始向缓冲区转换字节  
	WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, pAssii, ansiiLen, nullptr, nullptr);
	string ret_str = pAssii;
	free(pAssii);
	return ret_str;
}


string AsciiToUtf8(const string& str)
{
	return UnicodeToUtf8(AsciiToUnicode(str));
}
/* 不考虑任何异常的情况, 简单的get请求 */
/***
 *  buffer 		接收数据所在的缓冲区
 * 	size		要读取的字节数
 *  count		读写size长度的数据count次
 *  response	用户自定义文件指针
 */
size_t getUrlResponse(char* buffer, size_t size, size_t count, string* response) {
	size_t recv_size = size * count;
	response->clear();
	response->append(buffer);
	return recv_size;
}

string get(const string& url) {
	// 请求数据
	string response;
	// easy handle声明
	CURL *handle;
	// 初始化handle
	handle = curl_easy_init();
	// 设置url
	curl_easy_setopt(handle, CURLOPT_URL, url.c_str());

	//curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "POST");

	//设置curl的请求头
	// struct curl_slist* header_list = NULL;
	// header_list = curl_slist_append(header_list, "Content-Type:text/html;charset=UTF-8");//Content-Type:application/x-www-form-urlencoded  Content-Type:application/json
	// curl_easy_setopt(handle, CURLOPT_HTTPHEADER, header_list);

	//curl_easy_setopt(handle, CURLOPT_HTTPGET, NULL);//自定义请求方式
	curl_easy_setopt(handle, CURLOPT_POST, 1);//设置为非0表示本次操作为POST

	//设置ssl验证
	curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, false);
	curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, false);


	string data2,data ="format=json";
	data2 = AsciiToUtf8(data.c_str());
	//设置post请求的参数
	curl_easy_setopt(handle, CURLOPT_POSTFIELDS, data);

	// 注册回调函数
	curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, &getUrlResponse);

	// 获取信息
	curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);
	// 执行请求
	curl_easy_perform(handle);
	// 释放
	curl_easy_cleanup(handle);

	return response;
}
int main() {
	// 使用前初始化libcurl, 只需初始化一次
	curl_global_init(CURL_GLOBAL_DEFAULT);
	string _stRet = get("https://api.66mz8.com/api/rand.music.163.php");
	// 执行请求
	cout << _stRet;

	Json::Reader reader;
	Json::Value root;

	if (!reader.parse(_stRet, root, false))
	{
		cout << "reader parse error: " << strerror(errno) << endl;
		return -1;
	}

	string msg;
	int code;
	int size;

	size = root.size();
	cout << "total " << size << " elements" << endl;
		
	code = root["code"].asInt();
	msg = root["msg"].asString();		 
	//cout << "msg: " << unicodeToAnsi(utf_8ToUnicode(msg.c_str())) << ", code: " << code << endl;

	cout <<  " code: " << code << endl;
	cout << " name: " << unicodeToAnsi(utf_8ToUnicode(root["name"].asString().c_str())) << endl;
	cout << " artists_name: " << unicodeToAnsi(utf_8ToUnicode(root["artists_name"].asString().c_str())) << endl;
	cout << " music_url: " << unicodeToAnsi(utf_8ToUnicode(root["music_url"].asString().c_str())) << endl;
	cout << " music_pic: " << unicodeToAnsi(utf_8ToUnicode(root["music_pic"].asString().c_str())) << endl;
	 
	
	// 释放libcurl相关资源
	curl_global_cleanup();
	getchar();
	return 0;
}

方法2:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#pragma warning(disable:4996)
using namespace std;

#define POSTURL    "https://api.66mz8.com/api/rand.music.163.php"
#define POSTFIELDS "format=json"
#define FILENAME   "curlposttest.log"

size_t write_data(void* buffer, size_t size, size_t nmemb, void *stream)
{
	FILE *fptr = (FILE*)stream;
	fwrite(buffer, size, nmemb, fptr);
	return size * nmemb;
}

int main(int argc, char *argv[])
{
	CURL *curl;
	CURLcode res;
	FILE* fptr;
	struct curl_slist *http_header = NULL;

	if ((fptr = fopen(FILENAME, "w")) == NULL)
	{
		fprintf(stderr, "fopen file error:%s\n", FILENAME);
		return -1;
	}

	curl = curl_easy_init();
	if (!curl)
	{
		fprintf(stderr, "curl init failed\n");
		return -1;
	}

	//设置curl的请求头
	// struct curl_slist* header_list = NULL;
	// header_list = curl_slist_append(header_list, "Content-Type:text/html;charset=UTF-8");//Content-Type:application/x-www-form-urlencoded  Content-Type:application/json
	// curl_easy_setopt(handle, CURLOPT_HTTPHEADER, header_list);

	//设置ssl验证
	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);


	curl_easy_setopt(curl, CURLOPT_URL, POSTURL); //url地址
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, POSTFIELDS); //post参数
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //对返回的数据进行操作的函数地址
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr); //这是write_data的第四个参数值
	curl_easy_setopt(curl, CURLOPT_POST, 1); //设置问非0表示本次操作为post
	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); //打印调试信息
	curl_easy_setopt(curl, CURLOPT_HEADER, 1); //将响应头信息和相应体一起传给write_data
	curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //设置为非0,响应头信息location
	//curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/Users/zhu/CProjects/curlposttest.cookie");

	res = curl_easy_perform(curl);

	if (res != CURLE_OK)
	{
		switch (res)
		{
		case CURLE_UNSUPPORTED_PROTOCOL:
			fprintf(stderr, "不支持的协议,由URL的头部指定\n");
		case CURLE_COULDNT_CONNECT:
			fprintf(stderr, "不能连接到remote主机或者代理\n");
		case CURLE_HTTP_RETURNED_ERROR:
			fprintf(stderr, "http返回错误\n");
		case CURLE_READ_ERROR:
			fprintf(stderr, "读本地文件错误\n");
		default:
			fprintf(stderr, "返回值:%d\n", res);
		}
		return -1;
	}

	curl_easy_cleanup(curl);
}

案例下载:https://download.csdn.net/download/greless/18434548

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值