高手请入,Java和Windows API

cdmar79 2008-07-23 08:14:05
我的服务提供商给了以下的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代码,给出合适的解答,谢谢!
...全文
239 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdmar79 2008-07-24
  • 打赏
  • 举报
回复
今天找了个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中的内容呢?
yyunffu 2008-07-23
  • 打赏
  • 举报
回复
访问 WebService 直接以 POST 方式访问也可以,你这个就是 POST 请求,将发送参数放进发送部分即可,注意Http 头中,发送长度一定要正确。
yyunffu 2008-07-23
  • 打赏
  • 举报
回复
这个不是很难,要访问 WebService , VC 下运用 WinInet 很容易实现。运用 Http 协议发送 Soap 包给WebService 即可。
上网搜一下,应该有实现的。
Even__Chung 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cdmar79 的回复:]
哎!懂java的,可能不懂C++;懂C++的,可能不懂Java。
此事古难全。。。
请高手务必看一下吧

补充:服务应答结果为XML,供分析。

小弟也到C++那里去发个问问
[/Quote]

頂起
樓主加油!!
limon758 2008-07-23
  • 打赏
  • 举报
回复
C#还懂点```
zhj92lxs 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yanjing_mail 的回复:]
C++不懂
[/Quote]
cdmar79 2008-07-23
  • 打赏
  • 举报
回复
哎!懂java的,可能不懂C++;懂C++的,可能不懂Java。
此事古难全。。。
请高手务必看一下吧

补充:服务应答结果为XML,供分析。

小弟也到C++那里去发个问问
rascalboy520 2008-07-23
  • 打赏
  • 举报
回复
不懂,帮你顶一下吧,
yanjing_mail 2008-07-23
  • 打赏
  • 举报
回复
C++不懂
cdmar79 2008-07-23
  • 打赏
  • 举报
回复
这个是我的代码,和楼上没啥大区别吧!
你能看出啥问题?我晕,就是得不到想要的结果。。。
cdmar79 2008-07-23
  • 打赏
  • 举报
回复
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;
}
/******************************************************************************/
reality 2008-07-23
  • 打赏
  • 举报
回复

/*****************************************************************
* 函数介绍: 执行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;
}
reality 2008-07-23
  • 打赏
  • 举报
回复
String param = "config=XXX&enc=GB2312&spatialXml="+enxml+"&webname=www.dsfsdaf.com&skey=sdafasf";
huc.getOutputStream().write(param.getBytes()); ///////////////服务提供商特别告知,这里必须以流的方式发送请求,否则不正常
param 加上http://全路径看看
fengpt520 2008-07-23
  • 打赏
  • 举报
回复
不是很懂这个,给你顶一下
sjjf 2008-07-23
  • 打赏
  • 举报
回复
要看源代码这也很简单的,
在jdk src下面就有。

但我觉得,你需要关注的是发的内容的组织格式和连接的方式。
cdmar79 2008-07-23
  • 打赏
  • 举报
回复
你确定吗?呵呵
我已经用底层的
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest
来写了,都不行,你用VC封装的WinInet可以吗?
我自己写的Web service,我自己post就可以拿到。
现在问题是对方已经明确了说要流的方式发送请求。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧