Top > OOoBasic > Generic > HttpRequest

HTTP Request Edit

ネットワーク上のファイルをドキュメントとして開く場合は loadComponentFromURL メソッドで開くことができます。また、画像ファイルなどをダウンロード、入手する場合には css.ucb.SimpleFileAccess サービスが利用できます。

一方で POST メソッドでファイルを受け取る場合には上記の方法が利用できません。この場合には css.ucb.UniversalContentBroker サービスを利用します。 http や https プロトコルの場合には css.ucb.WebDAVContentProvider サービスが利用されます。

少し複雑ですが、次のようにして https プロトコルのアドレスに POST メソッドで要求、ファイルを入力として受け取ることができます。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
Sub HttpRequest_post
  
  sURL = "https://chart.googleapis.com/chart"
  sBody = "cht=qr&chs=100x100&chl=QR"
  
  oInput = Post(sURL, sBody)
  msgbox oInput.available()
  
End Sub
 
 
 
Function Post(sURL As String, sBody As String) As Variant
  oUCB = CreateUnoService("com.sun.star.ucb.UniversalContentBroker")
  oId = oUCB.createContentIdentifier(sURL)
  oContent = oUCB.queryContent(oId)
  
  oDataSink = CreateUnoListener("XDataSink_", _
      "com.sun.star.io.XActiveDataSink")
  
  oCommandEnv = CreateUnoListener("XCommandEnv_", _
      "com.sun.star.ucb.XCommandEnvironment")
  
  oBodyStream = CreateUnoService("com.sun.star.io.Pipe")
  oTextOutput = CreateUnoService("com.sun.star.io.TextOutputStream")
  oTextOutput.setOutputStream(oBodyStream)
  oTextOutput.writeString(sBody)
  oTextOUtput.closeOutput()
  
  oPostArgs = CreateUnoStruct("com.sun.star.ucb.PostCommandArgument2")
  oPostArgs.Source = oBodyStream
  oPostArgs.Sink = oDataSink
  
  aCommand = CreateUnoStruct("com.sun.star.ucb.Command")
  aCommand.Name = "post"
  aCommand.Argument = oPostArgs
  
  oRet = oContent.execute(aCommand, -1, oCommandEnv)
  
  oInput = oDataSink.getInputStream()
  Post = oInput
End Function
 
 
 
Dim oStream As Variant
Function XDataSink_setInputStream(oLocStream As Variant)
  oStream = oLocStream
End Function
Function XDataSink_getInputStream() As Variant
  XDataSink_getInputStream = oStream
End Function
 
 
Function XCommandEnv_getInteractionHandler()' As Variant
  XCommandEnv_getInteractionHandler = CreateUnoListener(_
      "XInteractionHandle_", "com.sun.star.task.XInteractionHandler")
End Function
Function XCommandEnv_getProgressHandler()' As Variant
  XCommandEnv_getProgressHandler = CreateUnoListener(_
      "XProgressHandle_", "com.sun.star.ucb.XProgressHandler")
End Function
 
 
Function XInteractionHandle_handle(oRequest)
End Function
 
Function XProgressHandle_push(nStatus)
End Function
Function XProgressHandle_update(nStatus)
End Function
Function XProgressHandle_pop()
End Function

InteractionHandler Edit

css.task.XInteractionHandler インターフェースを使用してユーザーによる動作を行わせることができます。例えば、ダイアログの OK ボタンを押すといったような、ユーザーによる認証や操作をすべき場所で使われています。 HTTPのリクエストで認証が必要な場所でも利用されており、ユーザー名とパスワードを入力するダイアログの表示などで利用されます。

次のハンドラは URL へアクセスした際の認証を取り扱います。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
Sub InteractionHandler_handle(req)
  r = req.getRequest()
  If CheckExceptionType(r, "com.sun.star.ucb.URLAuthenticationRequest") Then
    conts = req.getContinuations()
    for i = 0 to ubound(conts) step 1
      cont = conts(i)
      If HasUnoInterfaces(cont, "com.sun.star.ucb.XInteractionSupplyAuthentication2") Then
        cont.setUserName("foo")
        cont.setPassword("bar")
        cont.select()
        Exit For
      End If
    next
  End If
End Sub
 
 
Function CheckExceptionType(e, sType As String) As Boolean
  ret = False
  idlclass = CreateUnoService("com.sun.star.reflection.CoreReflection").getType(e)
  If not IsNull(idlclass) Then
    ret = (idlclass.getTypeClass() = com.sun.star.uno.TypeClass.EXCEPTION and _
           idlclass.getName() = sType)
  End If
  CheckExceptionType = ret
End Function

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes