我的服务提供商给了以下的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代码,给出合适的解答,谢谢!
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代码,给出合适的解答,谢谢!
解决方案 »
- webwork2中jsp显示日期时间问题
- HTTP Status 503 - This application is not currently available错误
- 关于一个配置的问题?
- 关于Hirbnate的update方法问题
- 有沒好的辦法解決Found two representations of same collection
- 提问:求时间自动增加的JSP代码或算法。
- jsp怎么实现自动跳转?
- IIS与TOMCAT4.0结合的问题
- 这个问题已经困扰我很长时间了,请诸位帮忙。
- tomcat 大问题呀!救我呀!!!!!!
- 求救:xml解析到jsp上
- STRUTS中如何用复选框得到ID值
楼主【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 %
敬礼!
此事古难全
请高手务必看一下吧补充:服务应答结果为XML,供分析。小弟也到C++那里去发个问问
上网搜一下,应该有实现的。
我已经用底层的
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest
来写了,都不行,你用VC封装的WinInet可以吗?
我自己写的Web service,我自己post就可以拿到。
现在问题是对方已经明确了说要流的方式发送请求。
在jdk src下面就有。但我觉得,你需要关注的是发的内容的组织格式和连接的方式。
huc.getOutputStream().write(param.getBytes()); ///////////////服务提供商特别告知,这里必须以流的方式发送请求,否则不正常
param 加上http://全路径看看
/*****************************************************************
* 函数介绍: 执行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;
}
{
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;
}
/******************************************************************************/
跟踪到的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中的内容呢?