zoukankan      html  css  js  c++  java
  • 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);
        
  • 相关阅读:
    本地图文直接复制到文本编辑器中
    本地图文直接复制到富文本编辑器中
    本地多张图片直接复制到富文本编辑器中
    能粘贴Word 内容(含图片)的富文本编辑器
    能粘贴Word 内容(含图片)的文本编辑器
    js+WebUploader分片上传大文件
    js+web分片上传大文件
    js+前端分片上传大文件
    Java学习——方法中传递参数分简单类型与复杂类型(引用类型)
    线段树练习
  • 原文地址:https://www.cnblogs.com/luyanhong456/p/8762699.html
Copyright © 2011-2022 走看看