api curl linux

2019-02-20 16:02:59 yysyangyangyangshan 阅读数 342
  • 查看钱包及RPC API

    区块链游戏开发的入门到深入了解 学到linux命令行;EOS环境安装;C++;HTML;CSS;JavaScript;React;Redux等知识。

    35人学习 张云波
    免费试看

curl可用于在linux下进行简单的接口测试。

以post为例,格式如下,

curl 你的url  -X POST -H "Content-Type:application/json" -d '对象的json字符串'

例如

curl http://test.buzhidao.com/api/NongShaApi/burenshiMethod  -X POST -H "Content-Type:application/json" -d '"ID":"123","Name":"haha","age":"99"'

 

2014-10-21 17:01:18 skdkjxy 阅读数 1380
  • 查看钱包及RPC API

    区块链游戏开发的入门到深入了解 学到linux命令行;EOS环境安装;C++;HTML;CSS;JavaScript;React;Redux等知识。

    35人学习 张云波
    免费试看

1:CURLcode curl_global_init(long flags);

    这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_global_init函数在其他libcurl函数调用前至少调用一次,程序最后需要调用curl_global_cleanup,进行清理。

参数:flags 

CURL_GLOBAL_ALL Initialize everything possible. This sets all known bits.

CURL_GLOBAL_SSL Initialize SSL

CURL_GLOBAL_WIN32 Initialize the Win32 socket libraries.

CURL_GLOBAL_NOTHING Initialise nothing extra. This sets no bit.


CURLcode 是一个enum,当CURLcode为CURLE_OK时,表示函数执行成功,否则失败,具体错误原因可以查看<curl/curl.h>文件内的定义。


2:curl_easy_init() - Start a libcurl easy session

curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理. 一般curl_easy_init意味着一个会话的开始. 它的返回值是CURL *,curl_easy_init函数是线程相关的,也就是说不能在一个线程中调用另外一个线程通过curl_easy_init创建的CURL指针


3:CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); 

描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.,要想具体了解CURL的行为,必须对CURLoption有足够的了解,具体可以参考:

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html


这里有两个类型不易理解CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Curlplus::writer);


设置一个回调函数,这个回调函数的格式是

size_t function( void *ptr, size_t size, size_t nmemb, void *stream);

ptr,返回数据的指针

size,返回数据每块的大小

nmemb,返回数据的块数(这里返回数据串的真正大小为size*nmemb)

stream,是curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); 中的buffer的指针。

在上面的例子中,buffer设置为一个string对象,所以,在回调函数writer中有了writerData->append(data, len); 


4:CURLcode curl_easy_perform(CURL *handle);

执行远程请求


参考资料

http://curl.haxx.se/

http://curl.haxx.se/lxr/source/docs/examples/


基于curl 的C API写了一个扩展C++ singleton类(当然curl也有C++ API),这个单体类只是对HTTP请求做了简单封装,提供post,get方法,并得到请求url内的返回值(保存到string对象中),也很容易扩展到其他协议上去。

Curlplus.h文件

#ifndef _CURLPLUS_H__

#define _CURLPLUS_H__ 


#ifndef __CURL_CURL_H

#include <curl/curl.h>

#endif


#ifndef __CURL_EASY_H

#include <curl/easy.h>

#endif


#include <memory>

#include <string> 


using namespace::std; 


namespace CP

{

    class Curlplus

    {

    public:

        static  Curlplus& get_instance();

        string post(const string& url,const string& content) const;

        string get(const string& url) const;

    protected:

        Curlplus(void);

        ~Curlplus(void);

        Curlplus(const Curlplus&);

        Curlplus& operator=(const Curlplus&);

        static int writer(char *data, size_t size, size_t nmemb,std::string *writerData);

    private:

        static auto_ptr<Curlplus> _instance;

        inline void _setCurlopt(CURL *curl,const string& url) const;

        // default timeout 300s

        static const int _defaulttimeout = 300;

        static string buffer;

        friend class auto_ptr<Curlplus>;

    };

}


#endif 


Curlpuls.cc文件 


#ifndef SPIVOT_CURLPLUS_H__

#include "Curlplus.h"

#endif 


using namespace std;

using namespace CP;

 


auto_ptr<Curlplus> Curlplus::_instance;

string Curlplus::buffer;

static char errorBuffer[CURL_ERROR_SIZE]; 


Curlplus& Curlplus::get_instance()

{

    if(_instance.get() == NULL)

    {

        _instance.reset(new Curlplus());

    } 


    return *_instance.get();

}


int Curlplus::writer(char *data, size_t size, size_t nmemb, string *writerData)

{

    if (writerData == NULL)

        return 0;

    int len = size*nmemb;

    writerData->append(data, len);


    return len;

}


Curlplus::Curlplus(void)


    CURLcode code = curl_global_init(CURL_GLOBAL_ALL);

    if(code != CURLE_OK)

    {

        cout << "curl_init failed, error code is: " << code;

    }

}


Curlplus::~Curlplus(void)

{

    curl_global_cleanup();


string Curlplus::post(const string& url, const string& content) const

{

    buffer="";

    CURL *curl = curl_easy_init();

    if(curl == NULL)

    {

        cout << "curl_easy_init failed ";

    }  


    _setCurlopt(curl,url);

    curl_easy_setopt(curl, CURLOPT_POST, 1 );

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, content.c_str());   


    CURLcode code = curl_easy_perform(curl);

    if(code != CURLE_OK)

    {

        cout << "curl_easy_perform failed: "<< code;

    }

    curl_easy_cleanup(curl);


    return buffer;


string Curlplus::get(const string& url) const

{

    buffer="";

    CURL *curl = curl_easy_init();

    if(curl == NULL)

    {

        cout << "curl_easy_init failed ";

    }  


    _setCurlopt(curl,url);

    CURLcode code = curl_easy_perform(curl); 


    if(code != CURLE_OK)

    {

        cout << "curl_easy_perform failed: "<< code;

    }

    curl_easy_cleanup(curl);

    return buffer;

}


void Curlplus::_setCurlopt(CURL *curl,const string& url) const {

    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);

    curl_easy_setopt(curl, CURLOPT_HEADER, 0);

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    curl_easy_setopt(curl, CURLOPT_TIMEOUT, _defaulttimeout);

    //curl_easy_setopt(curl, CURLOPT_VERBOSE, true);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Curlplus::writer);

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);


}


2018-11-08 10:31:26 h2604396739 阅读数 28851
  • 查看钱包及RPC API

    区块链游戏开发的入门到深入了解 学到linux命令行;EOS环境安装;C++;HTML;CSS;JavaScript;React;Redux等知识。

    35人学习 张云波
    免费试看

今天遇到个需求,linux上将txt文件导入数据库,需要监测txt中的数据是否完全导入了数据库,即txt中的行数是否和数据库中的行数是否一致的问题。问题是获取txt行数需要执行linux指令,需要java代码知道IP 端口 用户名 密码;线上安全问题,根本不允许java应用有这么大的权限。

经过mentor指点,可以反过来,让linux上使用指令调用我的java应用即可,即使用curl指令调用java接口。

1、调用get请求
$ curl http://www.linuxidc.com/login.cgi?user=test001&password=123456

2、调用post请求
$ curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi

3、xml格式post请求

方式一:发送磁盘上面的xml文件(推荐)
root [ /apps ]$ curl -X POST -H 'content-type: application/xml'  -d @/apps/myxmlfile.txt http://172.19.219.xx:8081/csp/faq/actDiaUserInfo.action
ps:其中myxmlfile.txt为磁盘上面的xml文件,后面为请求路径

方式二:在命令行直接发送xml结构数据

root [ /apps ]$ curl -H 'content-type: application/xml' -X POST -d '<?xml version="1.0" encoding="UTF-8"?><userinfoReq><subsNumber>13814528620</subsNumber><type>3</type></userinfoReq>' http://172.19.219.xx:8081/csp/faq/actDiaUserInfo.action
或者

root [ /apps ]$ echo '<?xml version="1.0" encoding="UTF-8"?><userinfoReq><subsNumber>13814528620</subsNumber><type>3</type></userinfoReq>'|curl -X POST -H'Content-type:text/xm' -d @- http://172.19.xx.xx:8081/csp/faq/actDiaUserInfo.action
ps:其中<?xml version...>就是要post的xml 文件,后面是请求路径,linux上双引号或单引号之间嵌套需要使用反斜杠 \ 进行转义

响应消息:

<?xml version="1.0" encoding="utf-8"?><result><result_code>0</result_code><result_text>success</result_text><getUserinfoRsp><userInfo><identityID>1117384802</identityID><phone>13814528620</phone><email>13814528620@139.com</email><accountID></accountID><province>江苏</province><city>南京</city><passId>7775637869243</passId></userInfo></getUserinfoRsp></result>
 

4、json格式post请求

方式一:发送磁盘上面的JSON文件(推荐)
root [ /apps ]$ curl -X POST -H 'content-type: application/json'  -d @/apps/myjsonfile.txt http://192.168.129.xx/AntiRushServer/api/ActivityAntiRush
ps:其中myjsonfile.txt为磁盘上面的JSON文件,后面为请求路径

方式二:在命令行直接发送JSON结构数据
root [ ~ ]$ curl -H 'content-type: application/json' -X POST -d '{"accountType":"4","channel":"1","channelId":"YW_MMY","uid":"13154897541","phoneNumber":"13154897541","loginSource":"3","loginType":"1","userIp":"192.168.2.3","postTime":"14633fffffffffff81286","userAgent":"Windows NT","imei":"352600051025733","macAddress":"40:92:d4:cb:46:43","serialNumber":"123"}' http://192.168.129.xx/AntiRushServer/api/ActivityAntiRush
响应消息:
{"code":"4000","message":"参数错误:time的值不是UInt"}

方式一:发送磁盘上面的请求报文文件(推荐)
root [ /apps ]$ curl -H 'Content-Type: text/xml;charset=UTF-8;SOAPAction:""' -d @/apps/mysoapfile.xml http://172.18.173.xx:8085/csp-magent-client/madapterservices/madapter/lmCountAccessor
ps:其中myjsonfile.txt为磁盘上面的请求报文文件,后面为请求路径

方式二:在命令行直接发送xml结构数据
[plain] view plain copy
<code class="language-plain">root [ /apps ]$ curl -H 'content-type: application/xml' -d '<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.accessor.madapter.csp.huawei.com"><soapenv:Header /><soapenv:Body><ser:leaveMessageCount><ser:in0><![CDATA[20161011160516XdznbN]]></ser:in0><ser:in1><![CDATA[1600106496388382726]]></ser:in1><ser:in2><![CDATA[14]]></ser:in2><ser:in3><![CDATA[<extendParams><channelid>1600</channelid><servicetype></servicetype><appid></appid><usertype>10</usertype><userid>6496388382726</userid><msisdn>13814528620</msisdn><email></email><account></account><nickname></nickname><questionType></questionType></extendParams>]]></ser:in3></ser:leaveMessageCount></soapenv:Body></soapenv:Envelope>' http://172.18.173.xx:8085/csp-magent-client/madapterservices/madapter/lmCountAccessor</code>  
响应消息
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><ns1:leaveMessageCountResponse xmlns:ns1="http://service.accessor.madapter.csp.huawei.com"><ns1:out>8</ns1:out></ns1:leaveMessageCountResponse></soap:Body></soap:Envelope>

借鉴:https://blog.csdn.net/russ44/article/details/53308838

2018-03-27 17:34:00 weixin_33962923 阅读数 385
  • 查看钱包及RPC API

    区块链游戏开发的入门到深入了解 学到linux命令行;EOS环境安装;C++;HTML;CSS;JavaScript;React;Redux等知识。

    35人学习 张云波
    免费试看

1.get方式请求

curl  -s  "http://mywebsite.com/index.php?a=1&b=2&c=3

注意双引号

2.post方式请求

curl  -d  'name=1&pagination=2'demoapp.sinap.com/worker.php

 

参考链接:https://www.cnblogs.com/z-books/p/6228284.html

转载于:https://my.oschina.net/qimhkaiyuan/blog/1785760

2018-12-06 17:00:41 yihanzhi 阅读数 750
  • 查看钱包及RPC API

    区块链游戏开发的入门到深入了解 学到linux命令行;EOS环境安装;C++;HTML;CSS;JavaScript;React;Redux等知识。

    35人学习 张云波
    免费试看

curl命令是通过url规则实现文件的上传或下载,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控服务器状态。

curl常用命令

1、查看网页内容:【curl url地址】

curl https://www.***.com

2、下载网页内容到指定文件:【curl url地址 >> 目标文件】、【curl -o 目标文件 url地址】

curl https://www.***.com >> test.txt
curl -o test.txt https://www.***.com

3、下载网址文件到当前目录:【curl -O url地址】

curl -O https://image.uczzd.cn/8477506868712349413.jpeg

4、查看网址返回头信息:【curl -l url地址】

curl -I http://www.***.com

5、查看网址返回头信息和网址页面内容:【curl -i url地址】

curl -i http://www.***.com

6、使用代理查看网址头信息:【curl -I url地址 -x ip地址:端口号】

curl -I http://www.***.com -x 127.0.0.1:80

7、设置请求的方法

curl -X POST --data "id=1&k=haha" "http://hlx.site.com/api/getTree"

8、添加请求头

curl --header 'Accept:*/*' 'http://hlx.site.com/api/getTree'