User Tools

Site Tools


programming:abap:http_property_get

GET file properties (metadata)

FUNCTION z_http_property_get.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(URI) TYPE  STRING
*"     VALUE(PROP_NAME) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(PROP_VALUE) TYPE  STRING
*"     VALUE(CODE) TYPE  I
*"     VALUE(REASON) TYPE  STRING
*"  TABLES
*"      TAB_PROP STRUCTURE  SMUM_XMLTB OPTIONAL
*"  EXCEPTIONS
*"      NO_LOGIN_ACCOUNT_AVAILABLE
*"      HTTP_COMMUNICATION_FAILURE
*"      HTTP_INVALID_STATE
*"      HTTP_PROCESSING_FAILED
*"----------------------------------------------------------------------
*    Proof of Concept by IperCube 2007
*"----------------------------------------------------------------------
 
  DATA: user TYPE string,
        pwd TYPE string,
        x_bytes TYPE i.
 
* Set User/Password Logon to web server
  user = 'my_user'.
  pwd  = 'my_password'.
 
* Translate URL
  TRANSLATE uri USING ' *'.
  REPLACE ALL OCCURRENCES OF '*' IN uri WITH '%20' IN CHARACTER MODE.
 
******************************************************************
* Build XML request 
******************************************************************
 
  DATA: xml_table        TYPE TABLE OF smum_xmltb,
        wa_xml_table     TYPE smum_xmltb,
        xml_output       TYPE string.
 
* Ask for all properties
  wa_xml_table-hier = 1.
  wa_xml_table-type = 'V'.
  wa_xml_table-cname = 'propfind'.
  wa_xml_table-cvalue = ''.
  APPEND wa_xml_table TO xml_table.
 
  wa_xml_table-hier = 1.
  wa_xml_table-type = 'A'.
  wa_xml_table-cname = 'xmlns'.
  wa_xml_table-cvalue = 'DAV:'.
  APPEND wa_xml_table TO xml_table.
 
  wa_xml_table-hier = 2.
  wa_xml_table-type = 'V'.
  wa_xml_table-cname = 'allprop'.
  wa_xml_table-cvalue = ''.
  APPEND wa_xml_table TO xml_table.
 
 
* Create XML
  CALL FUNCTION 'SMUM_XML_CREATE'
    IMPORTING
      xml_output = xml_output
    TABLES
      xml_table  = xml_table.
 
 
******************************************************************
* Get Properties via HTTP 
******************************************************************
 
* Create HTTP_CLIENT object
  DATA: client TYPE REF TO if_http_client,
        timeout       TYPE i VALUE 0.
 
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url    = uri
    IMPORTING
      client = client.
 
* Authentication
  CALL METHOD client->authenticate
    EXPORTING
*    PROXY_AUTHENTICATION = ' '
*      CLIENT               = sy-mandt
      username             = user
      password             = pwd
*      LANGUAGE             = 'E'.
 
 
* Set Header Fields - methods PRPFIND
  CALL METHOD client->request->set_header_field
    EXPORTING
      name  = '~request_method'
      value = 'PROPFIND'.
 
  CALL METHOD client->request->set_header_field
    EXPORTING
      name  = '~server_protocol'
      value = 'HTTP/1.1'.
 
  CALL METHOD client->request->set_header_field
    EXPORTING
      name  = 'depth'
      value = '1'.
 
  CALL METHOD client->request->set_header_field
    EXPORTING
      name  = 'content-type'
      value = 'text/xml'.
 
  x_bytes = STRLEN( xml_output ).
 
  CALL METHOD client->request->set_cdata
    EXPORTING
      data   = xml_output
      length = x_bytes.
 
* send and receive with HTTP server 
  CALL METHOD client->send
    EXPORTING
      timeout                    = timeout
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.
 
  CASE sy-subrc.
    WHEN 1. RAISE http_communication_failure.
    WHEN 2. RAISE http_invalid_state.
    WHEN 3. RAISE http_processing_failed.
**    WHEN 4. RAISE others.
  ENDCASE.
 
  CALL METHOD client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.
 
  CASE sy-subrc.
    WHEN 1. RAISE http_communication_failure.
    WHEN 2. RAISE http_invalid_state.
    WHEN 3. RAISE http_processing_failed.
**    WHEN 4. RAISE others.
  ENDCASE.
 
* Get XML with properties
  DATA: xml_return TYPE string.
  xml_return = client->response->get_cdata( ).
 
* Get Global Status
  CALL METHOD client->response->get_status
    IMPORTING
      code   = code
      reason = reason.
 
* Close connection
  CALL METHOD client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
 
 
******************************************************************
* Parse Xml, Set Export table with properties
******************************************************************
 
  DATA: xml_doc TYPE xstring.
  DATA: xreturn TYPE bapiret2_t WITH HEADER LINE.
 
 
*  Convert XML to Xstring
  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text           = xml_return
*   MIMETYPE       = ' '
*   ENCODING       =
   IMPORTING
     buffer         = xml_doc
   EXCEPTIONS
     failed         = 1
     OTHERS         = 2
            .
* Parse
  CALL FUNCTION 'SMUM_XML_PARSE'
    EXPORTING
      xml_input       = xml_doc
    TABLES
      xml_table       = tab_prop
      return          = xreturn
*    EXCEPTIONS
*      ERROR           = 1
            .
 
* Set Prop_Value, remove useless properties
  DATA: uc_prop_name TYPE string,
        uc_cname     TYPE string.
 
  uc_prop_name = prop_name.
  TRANSLATE uc_prop_name TO UPPER CASE.
 
  LOOP AT tab_prop INTO wa_xml_table.
 
    uc_cname = wa_xml_table-cname.
    TRANSLATE uc_cname TO UPPER CASE.
 
    IF uc_cname = uc_prop_name.
      prop_value =  wa_xml_table-cvalue.
    ENDIF.
 
    IF  wa_xml_table-type <> 'V'.
      DELETE tab_prop.
    ENDIF.
 
  ENDLOOP.
 
ENDFUNCTION.
programming/abap/http_property_get.txt · Last modified: 2012/12/13 17:12 by IperCube