Pb使用POSTURL

Pb使用POSTURL发送网页信息

 

 

PB9.0 通过http协议以POST方式将XML发送到协议服务器

 (2012-12-26 00:26:55)

转载

标签: 

杂谈


最近接触了手机支付系统,现在需要将生成的xml发送至服务器。
我查看了pb的帮助文件,posturl可以实现该功能


servicereference.PostURL ( urlname, urldata, headers, {serverport, } data )

Argument Description
servicereference Reference to the Internet service instance.
urlname String specifying the URL to post.
urldata Blob specifying arguments to the URL specified by urlname.
headers String specifying HTML headers. In Netscape, a newline (~n) is requiredafter
each HTTP header and a final newline after all headers.
serverport (optional) Specifies the server port number for the request. Thedefault value
for this argument is 0, which means that the port number is determined by thesystem
(port 80 for HTTP requests).
data InternetResult instance into which the function returns HTML.

 

 

------解决方案--------------------------------------------------------
Blob lblb_args
String ls_header
String ls_url
String ls_args
long ll_length
integer li_rc

inet iinet_base,iinet
//internetresult ir
iinet_base = create inet
iinet = create inet

li_rc = GetContextService( "Internet", iinet_base )

IF li_rc = 1 THEN

   
 ir = CREATEn_cst_internet
   
 ls_url = "http://xxx.com/getinfo.asp?"
   
 ls_args ="var1=tr&var2=tttt&var3=&var4=r&var5=&var6=&var7=tttt&var8=&var9=&var10=ttt&var11="
   
 lblb_args =Blob( ls_args )

   
 ll_length = Len(lblb_args )

   
 ls_header ="Content-Type: " + &
            
 "application/x-www-form-urlencoded~n" + &
         
 "Content-Length: " + String( ll_length ) + "~n~n"

    
 li_rc =iinet.PostURL( ls_url, lblb_args, ls_header, ir )

    
 messagebox('',string(li_rc))

END IF

integer li_filenum
li_filenum =fileopen('c:\1.html',textmode!,write!,shared!,replace!,encodingUTF8!)
filewriteex(li_filenum,ir.is_data)
fileclose(li_filenum)


ole_1.object.navigate('c:\1.html')

destroy iinet_base
destroy iinet
destroy ir

另一个方法,用ole

 

OLEObject dom,http
String Http_Name,result

Http_Name = "http://... "

dom = CREATE OLEObject
http = CREATE OLEObject
//messagebox
调试看是否成功
messagebox( 'http ',http.ConnectToNewObject( "Msxml2.XMLHTTP "))
messagebox( 'dom ',dom.ConnectToNewObject( "Msxml2.DOMDocument "))

dom.Load( "c:\xxx.xml ")
http.Open( "POST ", Http_Name, TRUE)
http.Send(dom.xml)
do While http.readyState <> 4 // '
查询状态,延时
yield()
Loop

result = http.responseText //
这个测试用! 你可不写
messagebox( 'result ',result)

 

网上就查了这些东西,用PB自带的inetole均可实现,年末忙了,有时间测试下

 

 

 

 

 

解决了pb与https的服务器交互问题

 

该帖是站在AFIC和版主提供的原始帖上的
http://bbs.csdn.net/topics/390552901
http://bbs.csdn.net/topics/390695513

首先看afic的原代码:

 

String ls_url,ls_data,ls_response

 

//采用https的URL

ls_url = 'https://192.168.142.245/JoyCard/coreServlet'    

 

OleObject lole_tenyear   //声明ole

lole_tenyear = CREATE oleobject

lole_tenyear.ConnectToNewObject("Microsoft.XMLHttp")//帮顶XMLhttp组件,我测过xp和win7都自带,不需安装任何辅助软件如.net环境

 

lole_tenyear.open ("POST",ls_url,false)    //参数解释请看:

//http://blog.csdn.net/ldl22847/article/details/9662927

 

lole_tenyear.setRequestHeader("Content-type", "application/x-www-form-urlencoded")

lole_tenyear.setRequestHeader('Content-Length',string(len(ls_data)))

 

//lole_tenyear.send ('')

lole_tenyear.send (ls_data) //关键是这一步:如果你的https的环境没有安装浏览器的认证的根证书,一定会报错退出,如果你申请安装了verisign等权威机构发的根证书,用ie打开上面的https,就不会报红色警告(问你是不是继续)。但pb不会提示你是不是继续,直接报错退出。verisign的证书一年好像要1万-10万元的服务费。在这里你如果想测试一下,你可以把上面的https地址换成https://www.alipay.com/  (支付宝的),不会报错的。注意:这里的证书及验证都是单向验证,不是双向的。

 

ls_response =lole_tenyear.responseText   //返回结果

messagebox("",ls_response)   

 

IF lole_tenyear.Status >= 300 THEN

MessageBox ("HTTP requestfailed:", lole_tenyear.StatusText ,Exclamation!,OK!)

END IF

 

 

destroy lole_tenyear

 

 

PostURL()
功能执行HTTP Post,这样PowerBuilder应用程序就可以通过CGINSAPIISAPI接口发送请求。
语法servicereference.PostURL ( urlname, urldata, headers, data )
参数
servicereference
Inet对象实例或引用
urlname
String类型,指定要发送请求的URL(统一资源定位器)
urldata
Blob类型,指定发送给urlname参数指定的URL的参数
headers
String类型,指定HTML首部。对Netscape浏览器来说,每个HTTP首部之后需要个换行符(~n),在所有首部之后再跟一个换行符(~n
data
InternetResult实例变量,用于保存返回的HTML
返回值
Integer
。函数执行成功时返回1,发生错误时返回下述值:
 -1
一般错误
 -2
指定的URL无效
 -4
不能连接到Internet
 -6Internet
请求无效
用法
该函数的data参数要求是继承了InternetResult对象的类用户对象实例,在该用户对象的定义中,需要定义覆盖函数InternetData(),用于处理Internet返回的HTML数据。由于Internet以异步方式传送数据,因此,data参数必须是某个实例变量或全局变量的引用(例如窗口级实例变量)。
示例 下面的代码调用PostURL()。其中,Iinet_base是个Inet类型的实例变量;n_ir_msgbox是继承了InternetResult对象的类用户对象,iir_msgbox是该用户对象的一个实例:
Blob lblb_args
String ls_headers
String ls_url
Long ll_length
ir_msgbox = CREATE n_ir_msgbox
ls_url = "http://coltrane.sybase.com/"
ls_url += "cgi-bin/pbcgi60.exe/"
ls_url += "myapp/n_cst_html/f_test?"
lblb_args = blob("")
ll_length = Len(lblb_args)
ls_headers = "Content-Length: " + String(ll_length) + "~n~n"
iinet_base.PostURL(ls_url, lblb_args, ls_headers, iir_msgbox)

 

 

This example calls the PostURL function using server port 8080. Iinet is an instance variable of type inet:

Blob lblb_args

String ls_headers

String ls_url

Long ll_length

iir_msgbox = CREATE n_ir_msgbox

ls_url = "http://coltrane.sybase.com/"

ls_url += "cgi-bin/pbcgi60.exe/"

ls_url += "myapp/n_cst_html/f_test?"

lblb_args = blob("")

ll_length = Len(lblb_args)

ls_headers = "Content-Length: " &

   + String(ll_length) + "~n~n"

iinet.PostURL &

   (ls_url, lblb_args, ls_headers, 8080, iir_msgbox)

This example shows the use of a header with the correct content-type for a form:

Blob lblb_args

 String ls_headers

 String ls_url

 String ls_args

 long ll_length

 integer li_rc

 

 li_rc = GetContextService( "Internet", iinet_base )

 IF li_rc = 1 THEN

    ir = CREATE n_ir

    ls_url = "http://localhost/Site/testurl.stm?"

    ls_args = "user=MyName&pwd=MyPasswd"

    lblb_args = Blob( ls_args )

    ll_length = Len( lblb_args )

    ls_header = "Content-Type: " + &

       "application/x-www-form-urlencoded~n" + &

       "Content-Length: " + String( ll_length ) + "~n~n"

    li_rc = iinet.PostURL( ls_url, lblb_args, &

       ls_header, ir )

 END IF

 

 

 

 

 

 

 

网易博客上的资料

http://limindo.blog.163.com/blog/static/2647585620142269576794/

(转)Powerbuilder inet.PostURL用法  

2014-03-2609:57:06|  分类: POWERBUILDER|举报|字号 订阅

    

  下载LOFTER我的照片书  |

目前PB的開發我都是把它當成一個 Remote Client UI

所以實際上它沒有連接資料庫,而完全是透過Coldfusion的服務頁面完成資料操作,

因此很多時候需要傳遞大量資料時,簡單的 inet.GetURL 函數就變得不好用了,

因此特地研究了inet.PostURL的用法,它的用法在Help上有兩個範例(我有修改過)

第一種是簡單的呼叫一個頁面,並取得頁面回傳的HTML內容:
(
請注意 linet  n_internetresult 都是必須先建立的物件與類別,可參考這裡)

Blob lblb_args
String ls_headers , ls_url
Long ll_length
n_internetresult lir_html
inet linet

linet = Create inet
lir_html = CREATE n_internetresult
ls_url = "http://www.mydoamin.com/testpage.cfm"
lblb_args = blob("")
ll_length = Len(lblb_args)
ls_headers = "Content-Length: " + String(ll_length) +"~n~n"
linet.PostURL (ls_url, lblb_args, ls_headers, 8080, lir_html)

destroy lir_html
destroy linet
上面這種方式並沒有傳遞參數,其實效果如同:

linet.GetURL("http://www.mydoamin.com:8080/testpage.cfm",lir_html)




不過上述方式實際在執行時是有點問題,那就是Cache,如果你已經執行過一次這個方式,其回傳內容會被CachePBVM內,當下次再執行時,它並不會重新發出請求,反而直接從記憶體Cache中的內容重新取出並回傳。

解決的方式可以在要傳遞的內容不要放空值,隨便填一個東西,只是這樣子做真的有點多此一舉,不如直接使用 GetURL 還來得直覺些: 

lblb_args = blob(String(today()))
ll_length = Len(lblb_args)


第二種方式帶有傳遞參數

Blob lblb_args
String ls_headers , ls_url , ls_args
Long ll_length
n_internetresult lir_html
inet linet

linet = Create inet
lir_html = CREATE n_internetresult
ls_url = "http://www.mydoamin.com/testpage.cfm"
ls_args = "user=John&pwd=123456"
lblb_args = blob(ls_args)
ll_length = Len(lblb_args)
ls_headers = "Content-Type: application/x-www-form-urlencoded~n"+ &
                   "Content-Length: " + String(ll_length) + "~n~n"
linet.PostURL (ls_url, lblb_args, ls_headers, 8080, lir_html)

destroy lir_html
destroy linet

其實上面這種效果也同等於下面的方式

linet.GetURL("http://www.mydoamin.com:8080/testpage.cfm?user=John&pwd=123456",lir_html)


但若要傳遞檔案就要使用HTML表單的 HTTP multipart/form-data

方式來處理會比較妥當,因此在PB Help說明不甚清楚的情況下就必須研究一下

HTTP
的相關協定了。

HTTP的協定中有訂製 multipart/form-data 傳輸的方式為 rfc1867協定
這個協定的基本結構如下:

Content-Type: multipart/form-data;boundary=****20110908123520****~r~n
Content-Length: 299
~r~n

~r~n

--****20110908123520****~r~n
Content-Disposition: form-data; name="user"
~r~n
~r~n
John
~r~n
--****20110908123520****~r~n
Content-Disposition: form-data; name="pwd"
~r~n
~r~n
123456
~r~n
--****20110908123520****
~r~n
Content-Disposition: form-data; name="txtfile"; filename="
我的訂單.txt"~r~n
Content-Type: text/plain
~r~n
~r~n
...
我的訂單.txt的內容...~r~n
--****20110908123520****
~r~n
Content-Disposition: form-data; name="imgfile"; filename="
我的照片.jpg"~r~n
Content-Type: image/jpeg
~r~n
Content-Transfer-Encoding: binary
~r~n
~r~n
...
我的照片.jpg的內容...~r~n
--****20110908123520****--
~r~n


可以看到淺藍色部份就是它的 Header粉色部份就是 Arguments

1.     Header 的地方 Content-Type:設定為 multipart/form-data;

2.     boundary 是用來定義分隔線的樣式,其內容可以自訂,一般而言都是亂數產生的文字,盡量避開會與內容發生相同的可能性。

3.     Content-Length: Arguments (粉色部份全部)內容的總長度。

4.     Header Arguments 中間由一個換行分隔(白色部份)

5.     粉色部份則是 Arguments的內容,而裡面每一個 argument 都由一個 boundary 分開,

6.     每一個作為分隔的 boundary 前面會再加上 --

7.     argument內容都會先定義其來源變數名稱:Content-Disposition: form-data;name="欄位名"

8.     然後會加個換行表示此欄位對應值的資料開始,直到遇到下一個 boundary 結束

9.     如果 argument 內容值不是單純的文字資料,則會視情況加上 Content-Type 或是 Content-Transfer-Encoding

10.  最後,整個 Arguments 的結束由 boundary 前後各加上 -- 作為結束符號



由於 PostURL Header Arguments 分開傳輸,所以淺藍色與粉色的部份就必須分開處理。

下面展示一個上傳圖片的 Script

Blob lblb_args , lblb_pic
String ls_headers , ls_url , ls_args , ls_bndy
Long ll_length
n_internetresult lir_html
inet linet
integer li_file

//讀取圖片
li_file = FileOpen("C:\myPic.jpg",StreamMode!)
FileReadEx(li_file,lblb_pic)
FileClose(li_file)
//建立網路物件
linet = Create inet
lir_html = CREATE n_internetresult
ls_url = "http://www.mydoamin.com/uploadpic.cfm"
//建立分隔字串
ls_bndy = "****" + String(cpu()) + "****"
//先產生其它argument資料
ls_args = "--" + ls_bndy + "~r~n" + &
             "Content-Disposition: form-data; name=~"user~"~r~n~r~n" +&
              "John~r~n" +&
              "--" +ls_bndy + "~r~n" + &
             "Content-Disposition: form-data;name=~"pwd~"~r~n~r~n" + &
             "123456~r~n" + &
              "--" +ls_bndy + "~r~n" + &
             "Content-Disposition: form-data; name=~"pic~";filename=~"MyPic.jpg~"~r~n" +&
              "Content-Type:image/jpeg~r~n" + &
             "Content-Transfer-Encoding: binary~r~n~r~n"
//轉成binary後加上圖片資料與結束符號
lblb_args = blob(ls_args) + lblb_pic + blob("~r~n--"+ ls_bndy + "--~r~n")
//計算Argumments長度
ll_length = Len(lblb_args)
ls_headers = "Content-Type: multipart/form-data; boundary="+ ls_bndy + "~r~n" + &
                   "Content-Length: " + String(ll_length) + "~r~n~r~n"
//Post方式上傳檔案
linet.PostURL (ls_url, lblb_args, ls_headers, 8080, lir_html)

destroy lir_html
destroy linet


注意:展示程式碼沒有檢查機制所以正常情況下該有的檢查還是要做,比如檔案開啟失敗等等,雖然你可以用PowerBuilder Exception來處理,但實際上不太建議。

附上 PowerBuilder 發送 http 請求的基本 Header 給大家參考:

POST /test/hello.htmlHTTP/1.1
Accept: image/gif, image/x-xbitmap,image/jpeg, image/pjpeg, */*
Content-Length: 16
User-Agent: PowerBuilder
Host: 192.168.0.155
Cache-Control: no-cache
Cookie: CFID=7835; CFTOKEN=15357209

2.0.1.1./.9./.9.

 

 

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值