您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > PB如何提交WEB请求包含中文参数的解决方案全过程
我要做的事情:我要用POST方式发送WEB请求到服务器,同时传输一些中文参数过去。开发环境:WIN764位下的PB10。服务器全部都是UTF8格式的。走的弯路:1.我先试图用inet的geturl/posturl方式,具体方法是:新建一个标准类对象,选择inet,然后保存,命名成n_inet,然后再新建一个标准类对象,选择internetresult,保存,命名成n_ir。注意,必须要修改n_ir的internetdata(data)函数,这个函数是处理web请求后服务器返回回来的网页的,其中的参数data就是blob形式的网页。这两个对象建好以后,然后就可以向web服务器发送请求了,因为geturl方式比较简单,所以我先用geturl进行尝试。Stringls_url,ls_text,ls_uid,ls_sendls_url='='呵呵哒'ls_uid='1002'ls_send=ls_url+'text='+ls_text+'&uid='+ls_uidn_inetln_inetn_irln_irln_inet=createn_inetln_ir=createn_irintegerli_retli_ret=ln_inet.geturl(ls_send,ln_ir)ifli_ret1thenmessagebox('发生错误',string(li_ret))elsemessagebox('提示','发送成功')endifdestroyln_inetdestroyln_ir运行这段代码,我发现我的服务器确实接受到了web请求,并且这里的internetdata确实接受到了服务器返回的html,但是有一个问题:中文乱码!!一开始我以为这是一个小问题,但结果,它让我付出了3天半的时间才最终解决。我先尝试把要发送的ls_send转换成UTF-8的格式:stringls_send1bloblb_templb_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请求,似乎也是一条路:下面是具体的代码:oleobjectio_scriptIo_script=createoleobjectlongll_1ll_1=io_script.connecttonewobject(MSScriptControl.ScriptControl)ifll_10thenmessagebox('提示','创建MSScriptControl.ScriptControl对象出错,请注册msscript.ocx')return-1endifintegerli_fileintegerli_readlinestringls_1stringls_jsli_file=FileOpen(send.js,linemode!,read!)ifli_file=-1thenreturn-1endifli_readline=FileRead(li_file,ls_1)dowhileli_readline-1ls_js=ls_js+ls_1+'~r~n'li_readline=FileRead(li_file,ls_1)loopfileclose(li_file)io_script.language=JScriptio_script.addcode(ls_js)anyla_1la_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)destroyio_script到addcode那一段就各种报错,又折腾了一天多,才发现是javascript写的有问题,如果addcode进去的Javascript有语法错误,PB运行就会报错。这个搞定以后,发现io_script.run()这个无论如何都不能正确地执行。。。网上找的各种说法都试过,全部都不行,我真怀疑他们到底是不是真的自己试过,很多都是复制粘贴别人的代码的,根本自己都没有测试过。。。怨念很深。算了,这条路也不通。3.于是找啊找,找啊找,终于被我找到一条线索,那就是直接使用MSWEBBROWSER控件。方法:打开一个窗口,然后Insert-control-Ole...-在跳出来的TAB页上面切换到Insertcontrol栏目,找到MSwebbrowser,点击确定,在窗口上选择合适的位置放下。然后,在程序目录下建立一个utf8.html,这里面是一个表单,然后我就操控这个控件去打开这个网页,然后在程序里面提交掉。虽然结果很简单,但过程是很艰辛的,因为期间各种报错,一开始无论如何也打不开本地的html,打开的是internet有问题的界面,然后我只好在本地的服务器上放上这个html,去远程获取,后来不知道怎么的改回本地的Html又行了。然后是更改控件的值,又是各种报错,最后是发现是这样:ole_1.object.navigate(file:///d:/website/utf8.html)timer(1)Time(1)里面的代码:timer(0)intli_countli_count=0li_count=ole_1.object.Document.getElementsByName(mob).lengthifli_count=1thenole_1.object.Document.getElementById(msg).setattribute(value,istru_msg.msg)ole_1.object.Document.getElementById(uid).setattribute(value,istru_msg.uid)ole_1.object.Document.getElementById(s1).clickelsetimer(1)endif为什么要在这里建立一个timer,是因为,如果把timer去掉,直接在navigate后面加上ole_1.object.document.getelementbyid的时候,可能会获取不到!因为navigate函数是不管网页有没有加载上,直接返回的,就是这里其实产生了两个线程,一个线程去加载网页,另外一个线程直接返回去执行后面的代码。【我调了一个上午,才偶然发现这样的事,日】这样建一个timer,就相当于等待网页加载完成,再去修改各种网页中控件的值,再去执行网页中的button的click事件。注意,click后面是不需要括号的。网上很多乱七八糟的代码真是很不负责任的,就是不知道从哪里拷贝粘贴过来,或者自己编造一段代码,也不管能不能行,就在那里装逼回答别人的问题。实际测试的结果是,服务器终于接受到了我发送过去的中文字符,没有任何问题。。。然后呢,我就完美地做到了用PB发送WEB请求,包含中文。GOOD
本文标题:PB如何提交WEB请求包含中文参数的解决方案全过程
链接地址:https://www.777doc.com/doc-2848910 .html