使用htps进行,Get请求和post请求

来源:互联网 发布:nba勇士队格林数据 编辑:程序博客网 时间:2024/06/07 03:37

1. 编译openssl, 生成lib 和dll,在本人资源中已经有各个版本的dll和lib

2.  Get 请求看


int getPages(constchar* host_addr,const int host_port,const char* pObject)
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0),&wsaData);
    
    SOCKET sockfd;
    if ((sockfd= socket(AF_INET,SOCK_STREAM, 0))== -1)
    {
        DebugMsg("Socket Error: %s",strerror(errno));
        return -1;
    }
    
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(host_port);
    server_addr.sin_addr.s_addr= inet_addr(host_addr);
    
    if (connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(structsockaddr))== -1)
    {
        DebugMsg("Connect Error:%s",strerror(errno));
        return -1;
    }
    
    SSL *ssl;
    SSL_CTX *ctx;
    // SSL initialize
    SSL_library_init();
    SSL_load_error_strings();
    ctx = SSL_CTX_new(SSLv23_client_method());
    if (ctx== NULL)
    {
        DebugMsg("SSL CTX new failed!");
        return -1;
    }
    
    ssl = SSL_new(ctx);
    if (ssl== NULL)
    {
        DebugMsg("SSL new failed!");
        return -1;
    }
    
    // link socket & SSL
    int ret = SSL_set_fd(ssl, sockfd);
    if (ret== 0)
    {
        DebugMsg("SSL link socket failed!");
        return -1;
    }
    
    RAND_poll();
    while (RAND_status()== 0)
    {
        unsigned short rand_ret= rand()% 65536;
        RAND_seed(&rand_ret,sizeof(rand_ret));
    }
    
    // SSL connect
    ret = SSL_connect(ssl);
    if (ret!= 1)
    {
        DebugMsg("SSL connect failed!");
        return -1;
    }
    
    char getRequest[1024];
    sprintf(getRequest,"GET %s HTTP/1.0\r\nHost: %s\r\n\r\n\r\n", pObject,"10.18.4.80");
    
    // send https request
    int totalsend = 0;
    int requestLen = strlen(getRequest);
    while (totalsend< requestLen)
    {
        int send= SSL_write(ssl, getRequest+ totalsend, requestLen- totalsend);
        if (send== -1)
        {
            DebugMsg("SSL send failed!");
        }
        totalsend +=send;
        DebugMsg("%d bytes send OK!", totalsend);
    }
    
    // receive https response
    int responseLen = 0;
    int i = 0;
    char buffer[8];
    memset(buffer, 0, 8);
    char returnBuffer[1024];
    memset(returnBuffer, 0, 1024);
    int p = 0;
    while ((responseLen= SSL_read(ssl, buffer, 1))== 1 && p<1024)
    {
        returnBuffer[p]= buffer[0];
        p++;
        if (i< 4)
        {
            if (buffer[0]== '\r' || buffer[0]== '\n')
                i++;
            else
                i = 0;
        }
    }
    
    DebugMsg("%s", returnBuffer);
    
    // shutdown community 
    ret = SSL_shutdown(ssl);
    if (ret!= 1)
    {
        DebugMsg("SSL shutdown failed!");
        return -1;
    }
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    ERR_free_strings();
    closesocket(sockfd);
    WSACleanup();
    return 0;
}

一定要注意: http的请求 head部分 跟 body部分  一定要有  \r\n\r\n

一定要注意, 改成post请求 需要改动的部分就是head的部分信息,还需要有Content-length字段。  post过去的数据一定是在 \r\n\r\n之后。切记


3. 看看我个 https post请求


NETAPI size_t MzHttpRequestRefundByHttps(char *szIpAddr, short wPort, char *szAccessKey, const char *szTimeStamp, const char *szToken, char *szSendBuf, char *szRecvBuf)
{
    char szOutBuffer[HTTP_RECV_SIZE] = { 0 };
    string strRequest;
    strRequest += "POST /order/refund HTTP/1.1";
    strRequest += "\r\n";
    strRequest +="Accept-Language:zh-CN,zh;q=0.8";
    strRequest +="\r\n";
    strRequest +="Accept-Encoding:gzip, deflate";
    strRequest +="\r\n";
    strRequest +="Accept:*/*";
    strRequest +="\r\n";
    strRequest +="Content-Type:application/x-www-form-urlencoded";
    strRequest += "\r\n";
    strRequest += "accessKey:" ;//ab488d3ef5b44d73a9365dfeac78fab0b3fbfe56";
    strRequest += szAccessKey;
    strRequest += "\r\n";
    strRequest += "timestamp:";//1453926259343";
    strRequest += szTimeStamp;
    strRequest += "\r\n";
    strRequest +="token:";//BE27989F5E198DB0B78A0A05F2611F0D9965B3D7";
    strRequest += szToken;
    strRequest += "\r\n";
    strRequest +="Host:";//172.19.24.230:9092";
    strRequest += szIpAddr;
    strRequest +=  "\r\n";
    strRequest += "Cache-Control:no-cache";
    strRequest += "\r\n";
    strRequest += "Content-Length:";
    
    //order/refund?device=PC&orderNum=10021014526921772292985&password=sdfsdaf
    string strBody(szSendBuf);
    size_t dwIndex = strBody.find("?");
    if (dwIndex == string::npos)
    {
        return 0;
    }
    strBody= strBody.substr(dwIndex+1);
    char szNumber[MAX_PATH] = {0};
    itoa(strBody.size(),szNumber,10);
    strRequest += szNumber;
    strRequest += "\r\n\r\n";
    strRequest += strBody;


   {
        PostRequestToHttpsServer(szIpAddr,443,"order/refund",strRequest.c_str(),szOutBuffer);
    }
 
    return strJson.length();
}





0 0