使用curl工具调试https接口
时间:2022-07-22
本文章向大家介绍使用curl工具调试https接口,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
工作中需要对接调试http接口,之前都是写代码测试,发现直接用curl这个工具更简单高效。
举例如下:
想要post一包数据给这个接口https://XXXXXXXXX
http报文头规定如下:
POST / HTTP/1.1
Host: XXXXXXXXXX:XXXX
Accept: */*
User-Agent: Donjin Http 0.1
Content-Type: x-ISO-TPDU/x-auth
Cache-Control: no-cache
Content-Length: 93
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(hex data)
用curl测试:其中需要提交的二进制数据,为了方便,写到aaa.bin文件中了。
curl https://XXXXXXXXX -v --cacert ./UP.pem -k -H 'User-Agent: Donjin Http 0.1' -H 'Content-Type: x-ISO-TPDU/x-auth' -H 'Cache-Control: no-cache' -H 'Content-Length: 93' --data-binary @aaa.bin
相比之前,用php写了个测试demo来说,这个工具更简单高效。
之前的php demo如下:
<?php
echo "hello test 111!";
echo "<br>";
/* PHP CURL HTTPS POST */
function curl_post_https($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据,json格式
}
//echo getcwd();
/**
* @name ssl Curl Post数据
* @param string $url 接收数据的api
* @param string $vars 提交的数据
* @param int $second 要求程序必须在$second秒内完成,负责到$second秒后放到后台执行
* @return string or boolean 成功且对方有返回值则返回
*/
function curl_post_ssl($url, $data, $second=30,$aHeader=array())
{
$ch = curl_init();
curl_setopt($ch,CURLOPT_VERBOSE,'1');
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
//curl_setopt($ch,CURLOPT_VERBOSE, '1'); //debug模式,方便出错调试
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/CUP_cacert.pem');
// curl_setopt($ch,CURLOPT_SSLCERTPASSWD,'');
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/CUP_cacert.pem');
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'User-Agent: Donjin Http 0.1',
'Content-Type: x-ISO-TPDU/x-auth',
'Cache-Control: no-cache',
'Content-Length: ' . strlen($data))
);
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$data = curl_exec($ch);
//$curlInfo = curl_getinfo($ch);
//echo $curlInfo;
if (curl_errno($ch)) {
echo 'Errno'.curl_error($ch);//捕抓异常
}
curl_close($ch);
if($data)
return $data;
else
return false;
}
/*
$data = [0,1];
$aHeader =[];
$rcode = curl_post_ssl($url,$data,10,$aHeader);
if($rcode)
{
echo "ok"!
}
else
{
echo "error"!
}
*/
function hex2bin($h){
if (!is_string($h)) return null;
$r='';
for ($a=0; $a<strlen($h); $a+=2)
{ $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
return $r;
}
function Hex2String($hex){
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
function hextostr($hex)
{
return preg_replace_callback('/\x([0-9a-fA-F]{2})/', function($matches) {
return chr(hexdec($matches[1]));
}, $hex);
}
$string = "005BXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0303135393838303231303031303231303136300011000000010030002953657175656e6365204e6f3136333135305358582d34433330343131390003303120";
$data = hex2bin($string);
#var_dump($data);
$url = 'https://XXXXXXXXXXXXXXXXX';
$aHeader = array();
$rcode = curl_post_ssl($url,$data,10,$aHeader);
//$rcode = curl_post_https($url,$data);
if($rcode)
{
echo "ok";
echo "<br>";
echo $rcode;
//$myStr="";
//for($i=0;isset($rcode[$i]);$i++)
//{
// $myStr.= chr($rcode[$i]);
//}
//var_dump($myStr);
//$res=json_decode($rcode,true);
echo "<br>";
echo 'respond hex data:';
echo "<br>";
$arr1 = str_split($rcode, 1);
foreach($arr1 as $akey=>$aval){
$arr1[$akey]=" ".bin2hex($aval);
echo $arr1[$akey];
}
//var_dump($arr1);
//echo hextostr($rcode);
//var_dump($rcode);
//echo Hex2String($rcode);
//implode('!', $rcode);
}
else
{
echo "error";
echo "<br>";
}
使用c语言的测试如下:
/* <DESC>
* Simple HTTPS GET
* </DESC>
*/
#include <stdio.h>
#include <pthread.h>
#include "curl/curl.h"
//#define POSTFIELDS "x00XXXXXXXXXXXXXXXX13x12x08x00x00x20x00x00x00xc0x00x16x00x00x01x31x30x30x30x30x31x35x39x38x38x30x32x31x30x30x31x30x32x31x30x31x36x30x00x11x00x00x00x01x00x30x00x29x53x65x71x75x65x6ex63x65x20x4ex6fx31x36x33x31x35x30x53x58x58x2dx34x43x33x30x34x31x31x39x00x03x30x31x20"
//#define POSTFIELDS "005B6XXXXXXXXXXXXXXXXXXX208000020000000c0001600000131303030303135393838303231303031303231303136300011000000010030002953657175656e6365204e6f3136333135305358582d34433330343131390003303120"
//struct curl_slist *headers=NULL;
unsigned char postdata[93] = {0x00,XXXXXXXXXXXXXXXXXX,0,0x00,0x20,0x00,0x00,0x00,0xc0,0x00,0x16,0x00,0x00,0x01,0x31,0x30,0x30,0x30,0x30,0x31,0x35,0x39,0x38,0x38,0x30,0x32,0x31,0x30,0x30,0x31,0x30,0x32,0x31,0x30,0x31,0x36,0x30,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x29,0x53,0x65,0x71,0x75,0x65,0x6e,0x63,0x65,0x20,0x4e,0x6f,0x31,0x36,0x33,0x31,0x35,0x30,0x53,0x58,0x58,0x2d,0x34,0x43,0x33,0x30,0x34,0x31,0x31,0x39,0x00,0x03,0x30,0x31,0x20};
//CURL *curl;
typedef struct post_args{
char* url;
char* postdata;
int postlen;
}postargs;
postargs args;
pthread_t tid[10];
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
int i = 0;
//FILE *fptr = (FILE*)userp;
//fwrite(buffer, size, nmemb, fptr);
printf("rcv size:%dn",nmemb);
for(i =0;i <nmemb;i++)
{
printf("%02x ",((unsigned char*)buffer)[i]);
}
printf("nrcv ok!n");
return nmemb;
}
static void* Https_Post(void* args )
{
postargs* margs;
CURL *curl;
CURLcode res;
struct curl_slist *headers=NULL;
char headerbuf[50];
int ret = 0;
long res_code = 0;
printf("=================================>>thread tid = %u start...n", pthread_self());
margs = (postargs*)args;
printf("thread begin post:n");
//curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, margs->url);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
//curl_easy_setopt(curl, CURLOPT_TIMEOUT,8);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,margs->postdata);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, margs->postlen);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
//curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);
//curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/UP.pem");
//curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE,"PEM");
//curl_easy_setopt(curl, CURLOPT_SSLKEY,"UP.pem");
curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/UP.pem");
headers = curl_slist_append(headers, "User-Agent: Donjin Http 0.1");
headers = curl_slist_append(headers, "Content-Type: x-ISO-TPDU/x-auth");
headers = curl_slist_append(headers, "Cache-Control: no-cache");
printf("data:%02x,%02x postlen:%dn",margs->postdata[0],margs->postdata[1],margs->postlen);
sprintf(headerbuf,"Content-Length: %d",margs->postlen);
headers = curl_slist_append(headers, headerbuf);
//set headers
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
printf("->begin send:n");
/* Perform the request, res will get the return code */
//pthread_mutex_lock(&gHTTPMutex);
res = curl_easy_perform(curl);
//pthread_mutex_unlock(&gHTTPMutex);
/* Check for errors */
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %sn",curl_easy_strerror(res));
ret = 1;
goto END;
}
printf("->send okn");
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &res_code);
printf("res:%d,res_code:%ldn",res,res_code);
if(( res == CURLE_OK ) && (res_code == 200 || res_code == 201))
{
ret = 0;
goto END;
}
ret = 2;
goto END;
}
else
{
printf("Init CURL failed...n");
//curl_global_cleanup();
return NULL;
}
END:
//last free the header list
curl_slist_free_all(headers);
/* always cleanup */
curl_easy_cleanup(curl);
//curl_global_cleanup();
printf("=====================================>>thread tid = %u end!n", pthread_self());
return NULL;
}
unsigned int Com_Dev_TxData( unsigned char *buf, unsigned int len, unsigned int timeout,unsigned int channel )
{
int i = 0;
int rcode = 0;
args.url = "https://XXXXXXX:XXXXX";
args.postdata = buf;
args.postlen = len;
for(i = 0;i < 1;i++ )
{
rcode = pthread_create(&tid[i],
NULL,
Https_Post,
(void*)&args);
}
for(i=0; i< 1; i++)
{
rcode = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminatedn", i);
}
}
void* task1(void* url )
{
//int i = 0;
int rcode = 0;
printf("task1 run...n");
rcode = Com_Dev_TxData(postdata,0x93,0,0);
while(1)
{
;
}
}
int main(void)
{
int rcode = 0;
char * url = "https://XXXXXXXX.xx";
curl_global_init(CURL_GLOBAL_DEFAULT);
rcode = pthread_create(&tid[9],
NULL,
task1,
(void*)url);
while(1)
{
;
}
curl_global_cleanup();
return 0;
}
########################################
#makefile
########################################
#编译主程序
BINARY := test
OBJ_DIR := ./
#CC= gcc
#LD= ld
CFLAGS= -g -pthread
LDSCRIPT= -g
LDFLAGS= -L ./LIBS
SRC = $(wildcard *.c)
DIR = $(notdir $(SRC))
OBJS = $(patsubst %.c,$(OBJ_DIR)%.o,$(DIR))
.PHONY: clean
all: prebuild $(BINARY)
prebuild:
@echo Building app...
$(BINARY) : $(OBJS)
@echo Generating ...
$(CC) -o $(BINARY) $(OBJS) $(LDFLAGS) $(LDSCRIPT)
@echo OK!
$(OBJ_DIR)%.o : %.c
$(CC) -c $(CFLAGS) $< -o $@
clean:
rm -f $(OBJ_DIR)*.o
@echo Removed!
- 从吉日嘎拉那里学到的……
- 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的
- C#中?与??的区别
- 隐藏在程序旮旯中的“安全问题”
- 调用PostgreSQL存储过程,找不到函数名的问题
- C#调用C和C++函数的一点区别
- EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
- 合并求取分组记录的第一条数据
- 一个脑洞“颇大”的恶搞链接
- SQL 行列转换简单示例
- SQLSERVER 2012计算上一条,下一条数据的函数
- 使用命名管道实现进程间通信
- 获取SqlServer存储过程定义的3种方法
- 【自然框架】开源社区活动,会员注册的第一份代码!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用脚本定时备份 MySQL 数据库
- 解决数独问题用人工智能还是量子计算?
- Leetcode 39. 组合总和(dfs)
- 短视频APP制作,设置高斯模糊
- 使用 Sunny-Ngrok 将内网程序发布到外网
- Leetcode 17. 电话号码的字母组合 (dfs)
- Java实现md5和base64加密解密的示例代码
- Spring 基于 XML 的 AOP
- SpringBoot 集成 Apache Camel FTP 实现文件同步
- Spring 基于 XML 的 IOC
- 初识 Spring
- Leetcode 55. 跳跃游戏 (贪心)
- SpringBoot 报 No operations allowed after connection closed 异常解决办法
- Leetcode 15 三数之和(双指针,去重)
- 洛谷 P1886 滑动窗口 /【模板】单调队列 (单调队列、线段树、RMQ(ST表))