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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了REST API用于连接在线REST服务器相关的知识,希望对你有一定的参考价值。

我正在尝试编写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
");
    headers += _T("Host: rest.cleverreach.com
");
    headers += _T("Method: POST
");
    headers += _T("Pragma: no-cache
");
    headers += _T("Keep-Alive: true
");
    headers += _T("Accept-Language: en-US
");
    CString szHeaders = headers;
    DWORD dwRet;
    CString strObject = _T("/v2/login.json");
    INTERNET_PORT nPort = INTERNET_DEFAULT_HTTP_PORT;
    CString parameters;
    parameters = "client_id=123456&login=test@test.de&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
"), sz));
        e->Delete();
    }

结果:

{"error":{"code":405,"message":"Method Not Allowed"}
答案
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

以上是关于REST API用于连接在线REST服务器的主要内容,如果未能解决你的问题,请参考以下文章

用于非授权连接的 Spring Security REST Api

REST API 和 Websocket API [关闭]

多次/循环请求 REST API 时处理连接丢失(客户端)

什么是REST API?

400错误代码,当使用RestTemplate进行Rest API时。

ElasticSearch 索引适用于 REST API,但不适用于 C# 代码