REST API用于连接在线REST服务器

问题描述 投票:0回答:1

我正在尝试编写REST API以连接到在线REST服务器。不幸的是,我无法连接到服务器并最终收到错误消息“不允许方法”。我已经使用Web浏览器中的REST API插件测试了在线REST服务器上的POST方法,并且方法被接受并且测试成功但我不明白为什么我的应用程序失败了。我想知道是否有人能够引导我朝着正确的方向前进。谢谢。

    CInternetSession session(_T("MySession"));
    CHttpConnection* pServer = NULL;
    CHttpFile* pFile = NULL;
    char *szBuff = new char[500];
    CString strServerName = _T("rest.cleverreach.com");
    CString headers = _T("Content-Type: application/x-www-form-urlencoded\r\n");
    headers += _T("Host: rest.cleverreach.com\r\n");
    headers += _T("Method: POST\r\n");
    headers += _T("Pragma: no-cache\r\n");
    headers += _T("Keep-Alive: true\r\n");
    headers += _T("Accept-Language: en-US\r\n");
    CString szHeaders = headers;
    DWORD dwRet;
    CString strObject = _T("/v2/login.json");
    INTERNET_PORT nPort = INTERNET_DEFAULT_HTTP_PORT;
    CString parameters;
    parameters = "client_id=123456&[email protected]&password=blahblahblah";
    try
    {
        pServer = session.GetHttpConnection(strServerName, nPort, NULL, NULL);
        pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
        pFile->AddRequestHeaders(szHeaders);
        pFile->SendRequest(szHeaders, szHeaders.GetLength(), &parameters, parameters.GetLength());
        pFile->QueryInfoStatusCode(dwRet);
        pFile->Read(szBuff, 500);
        CString tempSzBuff = CString(szBuff);
        _tprintf_s(tempSzBuff);     
    }
    catch (CInternetException *e)
    {
        TCHAR sz[1024];
        e->GetErrorMessage(sz, 1024);
        _tprintf_s ((_T("ERROR!  %s\n"), sz));
        e->Delete();
    }

结果:

{"error":{"code":405,"message":"Method Not Allowed"}
c++ windows rest post mfc
1个回答
1
投票
CString parameters;
...
pFile->SendRequest(szHeaders, szHeaders.GetLength(), &parameters, parameters.GetLength());

SendRequest中的第三个参数是LPVOID,它期望字符通常是ASCII或UTF8格式。不要传递&parameters的地址。你可以使用CString::GetBuffer

在ANSI中,使用

pFile->SendRequest(szHeaders, szHeaders.GetLength(), 
    parameters.GetBuffer(), parameters.GetLength());
parameters.ReleaseBuffer();

如果定义了UNICODE,则转换为UTF8

CStringA copy = CW2A(parameters, CP_UTF8);
pFile->SendRequest(szHeaders, szHeaders.GetLength(), 
    copy.GetBuffer(), parameters.GetLength());
copy.ReleaseBuffer();

pFile也需要清理。

另见SendRequest

© www.soinside.com 2019 - 2024. All rights reserved.