(本人测试,非最优解决方案)
PB如何提交WEB请求包含中文参数的解决方案全过程
我要做的事情:
我要用POST方式发送WEB请求到服务器,同时传输一些中文参数过去。开发环境:WIN7 64位下的PB10。服务器全部都是UTF8格式的。
走的弯路:
1.我先试图用inet的geturl/posturl方式,具体方法是:新建一个标准类对象,选择inet,然后保存,命名成n_inet,然后再新建一个标准类对象,选择internetresult,保存,命名成n_ir。注意,必须要修改n_ir的internetdata(data) 函数,这个函数是处理web请求后服务器返回回来的网页的,其中的参数data就是blob形式的网页。
这两个对象建好以后,然后就可以向web服务器发送请求了,因为geturl方式比较简单,所以我先用geturl进行尝试。
String ls_url,ls_text,ls_uid,ls_send
ls_url = 'http://127.0.0.1:8081/smsSys/sms/sendSms?'
ls_text = '呵呵哒' ls_uid = '1002'
ls_send = ls_url + 'text=' + ls_text + '&uid=' + ls_uid
n_inet ln_inet
n_ir ln_ir
ln_inet = create n_inet
ln_ir = create n_ir
integer li_ret
li_ret = ln_inet.geturl(ls_send,ln_ir)
if li_ret <1 then
messagebox('发生错误',string(li_ret))
else
messagebox('提示','发送成功')
end if
destroy ln_inet
destroy ln_ir
运行这段代码,我发现我的服务器确实接受到了web请求,并且这里的internetdata确实接受到了服务器返回的html,但是有一个问题:中文乱码!!一开始我以为这是一个小问题,但结果,它让我付出了3天半的时间才最终解决。
我先尝试把要发送的ls_send转换成UTF-8的格式:
string ls_send1
blob lb_temp
lb_temp = blob(ls_send,EncodingUTF8!)
ls_send1 = string(lb_temp,EncodingUTF8!)
我在internetdata函数里也使用了这个方式,确实是看到把ls_send的格式转换成了UTF-8的,但是乱码问题依旧。
也尝试过另外的转换UTF-8的方法,比如使用下面的:
ole_ADOStream.ConnectToNewObject("ADODB.Stream")这个来转换,具体代码也省略了,还是行不通。转换出来的文字不太对劲,也没有什么用。
后来找了很多资料才知道,为什么不行呢?因为geturl方式只能发送ASCII码,所以这条路不通。【其实原因到底是不是这样我也不是百分百确定,也许是因为别的原因?】
然后我试图用posturl方式:
postrul方式麻烦一些,要构造header什么的,具体代码网上也有,我就不贴了,header里面的内容也是很要紧的,如果格式不对,是会报错的。
但是后来才发现posturl只支持CGI的WEB服务器,我的服务器不支持CGI,我也不希望通过修改服务器的方式来支持,太麻烦了吧?
于是此路不通。
2.就这样折腾了一天多,从网上找啊找,PB的web开发的资料真是少得可怜,后来找到了一些线索,要么我用PB调用javascript,然后在javascript脚本中提交web请求,似乎也是一条路:
下面是具体的代码:
oleobject io_script
Io_script = create oleobject
long ll_1
ll_1 = io_script.connecttonewobject( "MSScriptControl.ScriptControl")
if ll_1<0 then
messagebox('提示','创建MSScriptControl.ScriptControl对象出错,请注册msscript.ocx')
return -1
End if
integer li_file integer li_readline string ls_1 string ls_js
li_file = FileOpen("send.js",linemode!,read!)
if li_file=-1 then
return -1
end if
li_readline=FileRead ( li_file, ls_1 )
do while li_readline>-1
ls_js=ls_js+ls_1+'~r~n'
li_readline=FileRead ( li_file, ls_1 )
loop
fileclose(li_file)
io_script.language= “JScript”
io_script.addcode(ls_js)
any la_1
la_1=io_script.run("SubmitArticle",astru_msg.url,astru_msg.dh,astru_msg.msg,astru_msg.uniqueflag,astru_msg.uid,astru_msg.activetime,astru_msg.sign)
destroy io_script
到addcode那一段就各种报错,又折腾了一天多,才发现是javascript写的有问题,如果addcode进去的Javascript有语法错误,PB运行就会报错。
这个搞定以后,发现io_script.run()这个无论如何都不能正确地执行。。。网上找的各种说法都试过,全部都不行,我真怀疑他们到底是不是真的自己试过,很多都是复制粘贴别人的代码的,根本自己都没有测试过。。。怨念很深。算了,这条路也不通。
3.于是找啊找,找啊找,终于被我找到一条线索,那就是直接使用MS WEB BROWSER控件。
方法:打开一个窗口,然后Insert->control->Ole...->在跳出来的TAB页上面切换到Insert control栏目,找到MS web browser,点击确定,在窗口上选择合适的位置放下。
然后,在程序目录下建立一个utf8.html,这里面是一个表单,然后我就操控这个控件去打开这个网页,然后在程序里面提交掉。
虽然结果很简单,但过程是很艰辛的,因为期间各种报错,一开始无论如何也打不开本地的html,打开的是internet有问题的界面,然后我只好在本地的服务器上放上这个html,去远程获取,后来不知道怎么的改回本地的Html又行了。
然后是更改控件的值,又是各种报错,最后是发现是这样:
ole_1.object.navigate("file:///d:/website/utf8.html")
timer(1)
Time(1)里面的代码:
Timer(0)
Int li_count
li_count = 0
li_count = ole_1.object.Document.getElementsByName("mob").length
if li_count = 1 then
ole_1.object.Document.getElementById("msg").setattribute("value",istru_msg.msg)
ole_1.object.Document.getElementById("msg").setattribute("value",istru_msg.msg)
ole_1.object.Document.getElementById("s1").click
else
timer(1)
end if
为什么要在这里建立一个timer,是因为,如果把timer去掉,直接在navigate后面加上ole_1.object.document.getelementbyid的时候,可能会获取不到!因为navigate函数是不管网页有没有加载上,直接返回的,就是这里其实产生了两个线程,一个线程去加载网页,另外一个线程直接返回去执行后面的代码。【我调了一个上午,才偶然发现这样的事,日】
这样建一个timer,就相当于等待网页加载完成,再去修改各种网页中控件的值,再去执行网页中的button的click事件。
注意,click后面是不需要括号的。
网上很多乱七八糟的代码真是很不负责任的,就是不知道从哪里拷贝粘贴过来,或者自己编造一段代码,也不管能不能行,就在那里装逼回答别人的问题。
实际测试的结果是,服务器终于接受到了我发送过去的中文字符,没有任何问题。。。
然后呢,我就完美地做到了用PB发送WEB请求,包含中文。 GOOD
本文记录了作者使用PowerBuilder(PB)在WIN7 64位环境下发送包含中文参数的WEB请求到UTF8格式服务器的过程。文章详细描述了作者尝试使用geturl、posturl方法遇到的乱码问题及解决方案,以及通过调用javascript和使用MS WEB BROWSER控件最终成功发送中文参数的经历。
2744

被折叠的 条评论
为什么被折叠?



