2016-03-15 19 views
-1

我需要做一個類似於下面引用的頭的http請求。Construct NET :: HTTP頭文件

POST /approval HTTP/1.1 
Content-Type:text/xml 
Content-Length:569 
Host:127.0.0.1 
Authorization: WSSE realm="SDP", profile="UsernameToken" 
X-WSSE: UsernameToken Username="xxxxxxxxxxxxxxx", PasswordDigest=" xxxxxxxxxxxxxxxx", Nonce=" xxxxxxxxxxxxxx", Created="2012-07-26T11:31:26Z" 
X-RequestHeader: request ServiceId="xxxxxxxxxxxxx", TransId=" xxxxxxxxxxxxxxxxxxx" , LinkId="xxxxxxxxxx", FA="xxxxxxxxxx" 
Cookie: sessionid=default8fcee064690b45faa9f8f6c7e21c5e5a 
Msisdn: 861111111 
X-HW-Extension: k1=v1;k2=v2 
<ns2:preapprovalrequest xmlns:ns2="http://www.xxxxxxxx.com"> 
<fromfri>ID:2341305205559/MSISDN</fromfri> 
<tofri>ID:2341305205559/MSISDN</tofri> 
<message>abc</message> 
</ns2:preapprovalrequest> 

我試圖讓Net :: HTTP Ruby 2.2.0庫有類似的東西。

url = 'http://xxx.xxx.xxx.xxx:xx/xxx/xxx/approval' 
request_xml = "<?xml version='1.0' encoding='UTF-8'?><ns2:approvalrequest xmlns:ns2='http://www.xxxxxxxx.com'><fromfri></fromfri><tofri></tofri><message></message></ns2:approvalrequest>" 
uri = URI(url) 
req = Net::HTTP::Post.new(uri.path) 
req.content_type = 'text/xml' 
req['Authorization']['/']="WSSE" 
req['Authorization']['realm']= "xxxxx" 
req['Authorization']['profile']="xxxxxxxx" 
req['X-WSSE']['/']="UsernameToken" 
req['X-WSSE']['Username']="" 
req['X-WSSE']['PasswordDigest']="" 
req['X-WSSE']['Nonce']="" 
req['X-WSSE']['Created']="" 
req['X-RequestHeader']['/']="request" 
req['X-RequestHeader']['ServiceId']="" 
req['X-RequestHeader']['TransId']="" 
req['X-RequestHeader']['LinkId']="" 
req['X-RequestHeader']['FA']="" 
req.body = request_xml 
response = Net::HTTP.start(uri.hostname, uri.port) {|http| 
    http.request(req) 
} 
result = Hash.from_xml(response.body) 

但是,這會對nil:NilClass引發錯誤**NoMethodError: undefined method [] ='。 on the line ** req ['Authorization'] ['/'] =「WSSE」`。任何想法如何構建具有多個字段的正確頭文件。

+0

你能比較req.each_header {'的輸出| N,V |把「#{n} =#{v}」}}(把它放在實際請求之前)加上你想要的頭文件?另外,它會拋出什麼錯誤? – BoraMa

+0

'this throws errors'究竟是什麼樣的錯誤? – phoet

+0

@phoet,請檢查編輯 – Acacia

回答

1

正在以一個空的哈希,或者合併到它或爲其分配適當

require 'net/http' 

req = Net::HTTP::Post.new('bla') 
req.content_type = 'text/xml' 
req['Authorization'] = { 
    '/' => "WSSE", 
    'realm' => "xxxxx", 
    'profile' =>"xxxxxxxx", 
} 
puts req['Authorization'] # => {"/"=>"WSSE", "realm"=>"xxxxx", "profile"=>"xxxxxxxx"}