PB如何提交WEB请求包含中文参数的解决方案全过程

本文记录了作者使用PowerBuilder(PB)在WIN7 64位环境下发送包含中文参数的WEB请求到UTF8格式服务器的过程。文章详细描述了作者尝试使用geturl、posturl方法遇到的乱码问题及解决方案,以及通过调用javascript和使用MS WEB BROWSER控件最终成功发送中文参数的经历。

(本人测试,非最优解决方案)

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 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值