libcurl windows下编译和post使用及https支持

osx上libcurl使用,简单,不用编译,使用brew很方便,windows平台需要自己编译。
现在github或是官网去下载包里projects\Windows直接有工程,选择相应的vs版本编译即可。

将库加入工程,编译报错
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_global_init
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_init
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_setopt
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_perform
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_strerror
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_cleanup
1>bitminner.obj : error LNK2001: 无法解析的外部符号 __imp__curl_global_cleanup
需要在c++预处理中加入BUILDING_LIBCURL;HTTP_ONLY

添加lib库文件
ws2_32.lib;wldap32.lib

附上一段post例程

struct MemoryStruct {
        char *memory;
        size_t size;
    };

    static size_t
        WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
    {
        size_t realsize = size * nmemb;
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;

        mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);
        if (mem->memory == NULL) {
            /* out of memory! */
            printf("not enough memory (realloc returned NULL)\n");
            return 0;
        }

        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;

        return realsize;
    }

    int curl_post(void)
    {
        CURL *curl;
        CURLcode res;
        struct MemoryStruct chunk;
        static const char *postthis = "Field=1&Field=2&Field=3";

        chunk.memory = (char*)malloc(1);  /* will be grown as needed by realloc above */
        chunk.size = 0;    /* no data at this point */

        curl_global_init(CURL_GLOBAL_ALL);
        curl = curl_easy_init();
        if (curl) {

            curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.1/");

            /* send all data to this function  */
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

            /* we pass our 'chunk' struct to the callback function */
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);

            /* some servers don't like requests that are made without a user-agent
            field, so we provide one */
            curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
            curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2);//接收数据时超时设置,如果10秒内数据未接收完,直接退出
            curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2);//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了
                                                              /* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
                                                              itself */
            curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));

            /* Perform the request, res will get the return code */
            res = curl_easy_perform(curl);
            /* Check for errors */
            if (res != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(res));
            }
            else {
                /*
                * Now, our chunk.memory points to a memory block that is chunk.size
                * bytes big and contains the remote file.
                *
                * Do something nice with it!
                */
                printf("%s\n", chunk.memory);
            }

            /* always cleanup */
            curl_easy_cleanup(curl);

            free(chunk.memory);

            /* we're done with libcurl, so clean it up */
            curl_global_cleanup();
        }
        return 0;
    }

对于windows,https支持,需编译openssl版本,并且附件openssl库
libeay32.lib
ssleay32.lib

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JNI是Java Native Interface的缩写,该技术允许Java应用程序调用本地编写的C/C++代码。因此,您可以使用JNI和libcurl库在Java应用程序中进行POST请求。 下面是一个使用JNI和libcurl库进行完整的POST提交的示例代码: 1. Java代码 ```java public class CurlWrapper { static { System.loadLibrary("curlwrapper"); } public native String post(String url, String postData); } ``` 2. C/C++代码 ```c++ #include <jni.h> #include <curl/curl.h> #include <string.h> JNIEXPORT jstring JNICALL Java_CurlWrapper_post(JNIEnv *env, jobject obj, jstring url, jstring postData) { CURL *curl; CURLcode res; const char *urlStr = env->GetStringUTFChars(url, 0); const char *postDataStr = env->GetStringUTFChars(postData, 0); char *response = NULL; long responseCode; size_t responseLen = 0; struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, urlStr); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postDataStr); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunc); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); res = curl_easy_perform(curl); if (res == CURLE_OK) { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); curl_easy_cleanup(curl); curl_slist_free_all(headers); responseLen = strlen(response); jstring result = env->NewStringUTF(response); free(response); env->ReleaseStringUTFChars(url, urlStr); env->ReleaseStringUTFChars(postData, postDataStr); return result; } else { curl_easy_cleanup(curl); curl_slist_free_all(headers); free(response); env->ReleaseStringUTFChars(url, urlStr); env->ReleaseStringUTFChars(postData, postDataStr); return NULL; } } } size_t writeFunc(char *ptr, size_t size, size_t nmemb, void *userdata) { size_t len = size * nmemb; char **response = (char **) userdata; *response = (char *) realloc(*response, len + 1); if (*response) { memcpy(*response, ptr, len); (*response)[len] = '\0'; } return len; } ``` 3. 编译 在Linux下,您可以使用以下命令编译C/C++代码: ``` gcc -shared -fPIC -o libcurlwrapper.so -I$JAVA_HOME/include -I$JAVA_HOME/include/linux curlwrapper.cpp -lcurl ``` 在Windows下,您可以使用以下命令编译C/C++代码: ``` gcc -shared -o curlwrapper.dll -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" curlwrapper.cpp -lcurl ``` 4. 调用 在Java代码中,您可以使用以下代码调用CurlWrapper.post方法: ```java CurlWrapper curlWrapper = new CurlWrapper(); String response = curlWrapper.post("https://example.com/api/", "param1=value1&param2=value2"); ``` 其中,第一个参数是目标URL,第二个参数是POST请求的数据。如果请求成功,该方法将返回响应文本,否则将返回null。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值