我的服务提供商给了以下的Java代码,供我访问Web Service:
URL url = null;
BufferedReader in = null;
InputStreamReader isr = null;
InputStream is = null;
HttpURLConnection huc = null;
StringBuffer s = new StringBuffer(333);
url = new URL("http://www.XXX.com/XXX");
huc = (HttpURLConnection)url.openConnection();
huc.setRequestMethod("POST");
huc.setDoOutput(true);
String param = "config=XXX&enc=GB2312&spatialXml="+enxml+"&webname=www.dsfsdaf.com&skey=sdafasf";
huc.getOutputStream().write(param.getBytes());   ///////////////服务提供商特别告知,这里必须以流的方式发送请求,否则不正常。
huc.getOutputStream().flush();
huc.getOutputStream().close();
is = huc.getInputStream();
isr = new InputStreamReader(is);
in = new BufferedReader(isr);
String line = null;
while((line = in.readLine()) != null) 
                s.append(line);
以上Java代码可以在Tomcat环境下获得期望的结果。
现在,我需要用C++实现相同的功能。我用Windows API 的Wininet.h集,但是,我试了很久也得不到期望的结果,我主要使用了以下的几个API:
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest 
由于我不知道Java的URL底层实现,也不知道所谓的Java的流方式发送对应的C++下该如何转换,所以,请高手们能否对应上面的Java代码,给出合适的解答,谢谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【cdmar79】截止到2008-07-23 08:14:09的历史汇总数据(不包括此帖):
    发帖的总数量:28                       发帖的总分数:870                      每贴平均分数:31                       
    回帖的总数量:38                       得分贴总数量:5                        回帖的得分率:13%                      
    结贴的总数量:28                       结贴的总分数:870                      
    无满意结贴数:1                        无满意结贴分:40                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:3.57  %               无满意结分率:4.60  %                  
    敬礼!
      

  2.   

    哎!懂java的,可能不懂C++;懂C++的,可能不懂Java。
    此事古难全
    请高手务必看一下吧补充:服务应答结果为XML,供分析。小弟也到C++那里去发个问问
      

  3.   

    这个不是很难,要访问 WebService , VC 下运用 WinInet 很容易实现。运用 Http 协议发送 Soap 包给WebService 即可。
    上网搜一下,应该有实现的。
      

  4.   

    访问 WebService 直接以 POST 方式访问也可以,你这个就是 POST 请求,将发送参数放进发送部分即可,注意Http 头中,发送长度一定要正确。
      

  5.   

    你确定吗?呵呵
    我已经用底层的
    InternetOpen 
    InternetConnect 
    HttpOpenRequest 
    HttpSendRequest
    来写了,都不行,你用VC封装的WinInet可以吗?
    我自己写的Web service,我自己post就可以拿到。
    现在问题是对方已经明确了说要流的方式发送请求。
      

  6.   

    要看源代码这也很简单的,
    在jdk src下面就有。但我觉得,你需要关注的是发的内容的组织格式和连接的方式。
      

  7.   

    String param = "config=XXX&enc=GB2312&spatialXml="+enxml+"&webname=www.dsfsdaf.com&skey=sdafasf"; 
    huc.getOutputStream().write(param.getBytes());  ///////////////服务提供商特别告知,这里必须以流的方式发送请求,否则不正常
    param 加上http://全路径看看
      

  8.   


    /***************************************************************** 
    * 函数介绍: 执行HTTP的Post或Get方法 
    * 输入参数: TCHAR* hdrs       - HTTP头 
    TCHAR* accept     - Accept类型 
    TCHAR* Method     - POST 或 GET 
    TCHAR* frmdata    - 要提交的数据 
    TCHAR* ServerName - 服务器地址 
    TCHAR* FormAction - 数据提交到的网页名称 
    * 输出参数: 无 
    * 返 回 值: int               - 返回操作状态(见SendSMS) 
    *****************************************************************/ 
    int doHTTP(TCHAR* hdrs, TCHAR* accept, TCHAR* Method, TCHAR* frmdata, TCHAR* ServerName, TCHAR* FormAction) 

    // 创建Internet 
    HINTERNET hSession = InternetOpen(“MyAgent”, 
    INTERNET_OPEN_TYPE_PRECONFIG, 
    NULL, 
    NULL, 
    0); 
    if (!hSession) 

    return 5; 

    // 连接服务器 
    HINTERNET hConnect = InternetConnect(hSession, 
    ServerName, 
    INTERNET_DEFAULT_HTTP_PORT, 
    NULL, 
    NULL, 
    INTERNET_SERVICE_HTTP, 
    0, 
    1); 
    if (!hConnect) 

    return 2; 

    // 创建一个请求 
    HINTERNET hRequest = HttpOpenRequest(hConnect, 
    Method, 
    FormAction, 
    HTTP_VERSION, 
    NULL, 
    (const char**)&accept, 
    0, 
    1); 
    if (!hRequest) 

    return 2; 

    // 发送请求 
    BOOL bSendRequest = HttpSendRequest(hRequest, 
    hdrs, 
    strlen(hdrs), 
    frmdata, 
    strlen(frmdata)); 
    if (!bSendRequest) 

    return 2; 

      

  9.   

    String (__fastcall HttpRequest)(DWORD TimeOut_Con, DWORD TimeOut_Snd, DWORD TimeOut_Rev, String Svr_Name, WORD Svr_Port, String Act_Verb, String Act_Obj, String Req_Head, String Req_Data)
    {
            String ret = "";
            String tmp = "";
            DWORD  len = 0;
            /**********************************************************************/
            HINTERNET hSession = InternetOpen("MTL", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
            if(
            hSession != NULL &&
            InternetSetOption(hSession, INTERNET_OPTION_CONNECT_TIMEOUT, &TimeOut_Con, sizeof(TimeOut_Con)) &&
            InternetSetOption(hSession, INTERNET_OPTION_SEND_TIMEOUT, &TimeOut_Snd, sizeof(TimeOut_Snd)) &&
            InternetSetOption(hSession, INTERNET_OPTION_RECEIVE_TIMEOUT, &TimeOut_Rev, sizeof(TimeOut_Rev))
            )
            {
                    HINTERNET hConnect = InternetConnect(hSession, Svr_Name.c_str(), Svr_Port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
                    if(hConnect != NULL)
                    {
                            HINTERNET hRequest = HttpOpenRequest(hConnect, Act_Verb.c_str(), Act_Obj.c_str(), NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_UI, 0);
                            if(hRequest != NULL)
                            {
                                    if(HttpSendRequest(hRequest, Req_Head.c_str(), Req_Head.Length(), Req_Data.c_str(), Req_Data.Length()))
                                    {
                                            tmp.SetLength(32);
                                            len = tmp.Length();
                                            if(HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE, tmp.c_str(), &len, NULL))
                                            {
                                                    tmp.SetLength(len);
                                                    if(tmp.ToIntDef(0) == HTTP_STATUS_OK)
                                                    {
                                                            tmp.SetLength(32);
                                                            len = tmp.Length();
                                                            if(HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, tmp.c_str(), &len, NULL))
                                                            {
                                                                    tmp.SetLength(len);
                                                                    
                                                                    ret.SetLength(tmp.ToIntDef(0));
                                                                    len = ret.Length();
                                                                    if(InternetReadFile(hRequest, ret.c_str(), len, &len))
                                                                    {
                                                                            ret.SetLength(len);
                                                                    }
                                                                    else
                                                                    {
                                                                            ret.SetLength(0);
                                                                    }
                                                            }
                                                    }
                                            }
                                    }
                                    InternetCloseHandle(hRequest);
                            }
                            InternetCloseHandle(hConnect);
                    }
                    InternetCloseHandle(hSession);
            }
            /**********************************************************************/  
            return ret;
    }
    /******************************************************************************/
      

  10.   

    今天找了个HTTP的sniffer,观察了Java和C++的区别,目前的问题集中在了C++程序收到结果怎么取,详细如下:
    跟踪到的HTTP HEAD:
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Transfer-Encoding: chunked
    Date: Thu, 24 Jul 2008 02:43:30 GMT
    由于这个HTTP HEAD没有Content-Length,所以,我在处理的时候
    HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, tmp.c_str(), &len, NULL)
    得到的长度永远为0,再用
    InternetReadFile(hRequest, ret.c_str(), len, &len)
    取HTTP BODY内容时,结果就是空的了。
    那么,请问各位高手,如果我收到的HTTP HEAD就是上面这样的,我该怎么去获取HTTP BODY中的内容呢?