curl一些使用技巧

一、使用curl post,若post的数据大于1024,curl不会自己发起post请求,而分为2步:

  第一步:发送一个请求,header中包含一个Expect:100-continue,询问server是否愿意接受数据

  第二步:接收到server返回的100-continue回应之后才post数据

  这样会导致请求有延迟

  解决方法:将header中Expect设置为空

二、CURLOPT_CUSTOMREQUEST

  设置DELETE方法

三、上传&下载文件

size_t WriteFunc(void *ptr, size_t size, size_t nmemb, FILE *stream)  
{  
  return fwrite(ptr, size, nmemb, stream);  
}

static int Debug(CURL *curl, curl_infotype ty, char *p, size_t len, void *puser)
{
    std::string *psDebug = (std::string *)puser;
    switch (ty)
    {
    case CURLINFO_HEADER_IN:
    case CURLINFO_HEADER_OUT:
    case CURLINFO_DATA_IN:
    case CURLINFO_DATA_OUT:
        psDebug->append(p, len);
        break;
    default:
        break;
    }
    return 0;
}

 上传文件:

 // HTTP POST multipart/form-data 请求数据 
    struct curl_httppost *pHttpMultiPost = NULL;
    struct curl_httppost *pTemp = NULL;
    curl_formadd(&pHttpMultiPost,
                     &pTemp,
                     CURLFORM_COPYNAME, "data_file",
                     CURLFORM_FILE, “uploadfile”,
                     CURLFORM_END);

下载文件:

  FILE *outfile;  

    CURL *curl = curl_easy_init();
    if (!curl) 
    {
       printf("init curl fail
");
       return -1;
    }

    if(!CFG->m_sUrlProxy.empty())
    {
        curl_easy_setopt(curl, CURLOPT_PROXY, CFG->m_sUrlProxy.c_str());  //proxy
    }
    
    outfile = fopen(sDataFile.c_str(), "wb");  
   
    curl_easy_setopt(curl, CURLOPT_URL, sJssUrl.c_str()); 
    
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);  
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFunc);  
    
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); 
    
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    std::string sDebug;
    curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, Debug);
    curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &sDebug);

    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);    

    CURLcode res = curl_easy_perform(curl);
    
    /* Check for errors */
    if (res != CURLE_OK) 
    {
       printf("res != CURLE_OK, sDebug[%s]
", sDebug.c_str());
       curl_easy_cleanup(curl);
       return -1;
    }

    long  http_code = 200;
    curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);

    if(http_code != 200)
    {
        printf("http_code = %d
", http_code);
        curl_easy_cleanup(curl);
           return -1;
    }

    int iRet = 0;
    do
    {
        /* Check for errors */
        if (res != CURLE_OK) 
        {
           printf("res != CURLE_OK
");
           iRet = -1;
           break;
        }

        long  http_code = 200;
        curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);

        if(http_code != 200)
        {
            if(http_code != 201)
            {
                printf("http_code = %d
", http_code);
                iRet = -1;
                break;
            }
        }
        
    }while(0);

     /* always cleanup */
    curl_easy_cleanup(curl);
    
原文地址:https://www.cnblogs.com/luyanhong456/p/8762699.html