通过之前对的lic流程我们可以用get去抓取http协议上的内容,但是面对人脸识别中的https协议却没有办法,连接不上,错误代码总显示3。
原因是我们没有安装openSSL,https=http+SSL。
安装openSSL流程
1.1、下载openssl源码
wget https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz
1.2、解压、配置、编译并安装
1.tar -xzf openssl-1.1.1i.tar.gz
2.cd openssl-1.1.1i/
1. ./config//(不加任何参数就等于编译后放入默认路劲底下)
2. make -j4
3. sudo make install
最后再curl库中编译要加上参数./configure --prefix=$PWD/__install --with-ssl=/opt/OpenSSL
这样就完成了,可以访问上https协议的网站了
https协议post请求的编写,基于祥云ocr实现的人脸识别代码。
其中代码解析。
1.CURLcode curl_global_init(long flags)
如果它在curl_easy_init()之前未调用,将由libcur库自己调用,所以在多线程中应该主动调用curl_easy_init(),把它放入主线程中,以免子线程再次调用。
参数
flags
CURL_GLOBAL_ALL //初始化所有的可能的调用。(常用)
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化。
2.void curl_easy_cleanup(void)
用来对curl_global_init做清理工作,相当与close函数。
3.CURL *curl_easy_init( );
用来初始化一个CURL的指针(相当于文件编程中的fd,和socket编程里的返回值),相应的在调用结束时要用curl_easy_cleanup函数清理。
4.CURLcode curl_easy_perform(CURL *handle)里面放入,CURL指针这相当于一个舞台去展现事先执行CURL,放到所有配置完毕之后去执行。
6.CURLcode curl_easy_setopt(CURL *handle, CURLoption option,parameter);
parameter是由option来决定的。
option参数选择(我所用到的)
1.CURLOPT_POSTFIELDS 一个是去post请求,后面是一个指针存放相关的参数(在代码中我所使用的是,sprintf()去写入进去)。
2. CURLOPT_URL指定URL,后面是你要登录的网址,
3.CURLOPT_WRITEFUNCTION CURLOPT_READDATA两个
CURLOPT_WRITEFUNCTION
是制作一个函数size_t readfunction(void* ptr,size_t size,size_t nmemb,void * stream)其中ptr是用来指向网址返回过来的内容。(直接将函数名放到后面即可)
CURLOPT_READDAT
表明CURLOPT_READFUNCTION函数原型中的stream指针来源,用发是可以定义一个文件后面放入文件标识符即可。
在这里插入代码片
```#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define true 1
#define false 0
typedef unsigned int bool;
size_t readfunction(void* ptr,size_t size,size_t nmemb,void * stream)
{
char buf[1024];
char *p=(char *)ptr;
strncpy(buf,(char *)ptr,1024);
printf("1:%s,2:%s\n",p,buf);
printf("=============================================get data=======================================\n");
}
bool postUrl( )
{
CURL *curl;
CURLcode res;
char *postString;
char *img1[10];
char *img2[10];
char *key="自己的";
char *secret="自己的";
int typeId=21;
char *format="xml";
system("base64 shentian1.jpg > tmpfile");
int fd=open("tmpfile",O_RDWR);
int moint=lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
char *buf=(char *)malloc(moint+2);
memset(buf,'\0',moint+2);
read(fd,buf,moint);
system("base64 shentian2.jpg > tmpfile2");
int fd2=open("tmpfile2",O_RDWR);
int moint2=lseek(fd2,0,SEEK_END);
lseek(fd2,0,SEEK_SET);
char *buf2=(char *)malloc(moint2+2);
memset(buf2,'\0',moint+2);
read(fd2,buf2,moint2);
close(fd2);
int len=strlen(key)+strlen(secret)+strlen(buf)+strlen(buf2)+124;
postString=(char *)malloc(len);
memset(postString,'\0',len);
sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s","buf","buf2",key,secret,typeId,format);
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString); // 指定post内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,readfunction); //将返回的http头输出到函数readfuction
res = curl_easy_perform(curl);
printf("complete:%d\n",res);
curl_easy_cleanup(curl);
}
return true;
}
int main(void)
{
postUrl();
}