0

私のコードは、ベンダーが提供する小さな Java アプリケーションと通信します。この Java アプリは、「マシン」の状態を制御するために使用される localhost:57000 に Web サーバーをセットアップします。この質問のために、「マシン」の状態を「オフ」から「オン」に変更する必要があります。これを実現するには、次の文字列をhttp://localhost:57000/settings.xmlの「マシン」に HTTP PUT する必要があります。

<settings><machine_state><status>on</status></machine_state></settings>

この Curl コマンドは完全に機能します。

curl -X PUT -H "Content-Type:application/xml" -d @settings.xml http://localhost:57000/settings.xml "

ローカル ファイル 'settings.xml' には、上記の xml 文字列が含まれています。

Curl が MFC の WININET クラスで行っていることを実行したいと考えています。次のコードは、カールとまったく同じことを行う必要があります。悲しいことに、localhost Web サーバーはコード 200 を返しますが、xml 文字列を無視します。私が見逃している小さなことは何ですか?

int MyHttp::HttpPutThread() NOTHROW
{
    try {
            m_xml =  "<settings><machine_state><status>on</status></machine_state></settings>";
            m_url = "settings.xml"
        CInternetSession session; 
        SetSessionOptions(session);
        CString server = "localhost:57920";
        boost::scoped_ptr<CHttpConnection> phttp(session.GetHttpConnection(server));
        LPCTSTR accept = 0;//"text/xml";
        boost::scoped_ptr<CHttpFile> phttpfile(phttp->OpenRequest(
            "PUT", //verb
            "settings.xml", //object name
            0, //referer
            1, //context
            &accept, // accept types
            0, //version
            INTERNET_FLAG_EXISTING_CONNECT));           

        CString header = "Content-Type:application/xml\r\n";
        if(phttpfile->SendRequest(header,(LPVOID)m_xml.GetBuffer(), m_xml.GetLength()))
        {       // LOG_DEBUG (Same as TRACE) output are shown in comment
            DWORD code(0);
            phttpfile->QueryInfoStatusCode(code);
            LOG_DEBUG("HttpPutThread result code: %d", code); // '200'
            CString object = phttpfile->GetObject();
            LOG_DEBUG("object: %s", object); // 'settings.xml'
            CString statustxt;
            phttpfile->QueryInfo(HTTP_QUERY_STATUS_TEXT,statustxt);
            LOG_DEBUG("status text:%s", statustxt); // 'HTTP/1.0 200 OK'
            CString rawheaders;
            phttpfile->QueryInfo(HTTP_QUERY_RAW_HEADERS,rawheaders);
            LOG_DEBUG("raw headers:%s", rawheaders); // http://localhost:57000/settings.xml
            LOG_DEBUG("File url:%s",phttpfile->GetFileURL());
            LOG_DEBUG("Verb:%s", phttpfile->GetVerb()); // 'PUT'

        } else      
        {
                    //This does not happen
            LOG_DEBUG("PUT failed in AffHttp::HttpPutThread");  
        }

    } catch(CInternetException* pe)
    {
            //No exceptions are thrown
        LOG_DEBUG("Exception HttpPutThread:%d", pe->m_dwError);
        pe->Delete();
    }
    return 0;
}

前もって感謝します。

4

1 に答える 1

0

MFCクラスを自分の低レベルのソケットコードに置き換えて、Curlとまったく同じ順序でまったく同じテキストを送信することにしました。小さな埋め込みの「jetty」Javaサーバーが、MFCクラスによって生成されたヘッダーの1つに反対したように見えました。

于 2009-03-22T02:14:05.490 に答える