Wie in dem vorherigen Beispiel beschrieben, kann über die SharePoint API auch ein Listenelement erstellt werden. Dazu wird ein HTTP Post Methodenaufruf verwendet. Dieser Aufruf erwartet im Header zwingend die Angabe eines X-RequestDigest. Dieser Wert kann mit der API /_api/contextinfo ermittelt werden.
Das folgende Beispiel zeigt, wie man ein Listenelement aus SAP heraus erstellen kann.
*&---------------------------------------------------------------------* *& Report Z_TEST_RESTFUL_SERVICE *& *&---------------------------------------------------------------------* *& SharePoint API aufrufen *& POST Methode aufrufen zum Erstellen eines Listenelements *&---------------------------------------------------------------------* REPORT z_test_restful_service_post. DATA: lo_http_client TYPE REF TO if_http_client, lv_service TYPE string, lv_result TYPE xstring, lv_validation TYPE string, lo_nodes TYPE REF TO if_ixml_node, lo_ixml_node_iterator TYPE REF TO if_ixml_node_iterator, lv_formdigestvalue TYPE string, lo_proxy_xpath TYPE REF TO cl_proxy_xpath, lv_xpath TYPE string. *---------------------------------------------------------------------------------------- * X-RequestDigset lesen, erforderlich für SecurityValidation, nur bei POST Methoden *---------------------------------------------------------------------------------------- lv_service = 'http://<url>/sites/<my_site>/_api/contextinfo'. " Http Client erstellen cl_http_client=>create_by_url( EXPORTING url = lv_service IMPORTING client = lo_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4 ). " Methode setzen lo_http_client->request->set_method( if_http_request=>co_request_method_post ). " Protokollversion setzen lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ). " content type setzen lo_http_client->request->set_content_type( 'application/json;odata=verbose' ). " Header setzen lo_http_client->request->set_header_field( name = 'accept' value = 'application/xml' ). lo_http_client->request->set_header_field( name = 'content-type' value = 'application/json;odata=verbose;charset=utf-8' ). "lo_http_client->request->set_header_field( name = 'connection' value = 'keep-alive' ). " Anmeldung mittels BASIC Authentifizierung. DOMAIN\user:password als BASE64 codierung lo_http_client->request->set_header_field( name = 'Authorization' value = 'Basic hereComesBase64String' ). " HTTP Request senden lo_http_client->send( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 ). " HTTP Response auswerten lo_http_client->receive( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 ). " XML Ergebnis lesen lv_validation = lo_http_client->response->get_cdata( ). " XPATH Query lv_xpath = '/d:GetContextWebInformation/d:FormDigestValue'. " XPATH Helper Klasse erstellen lo_proxy_xpath = NEW #( ). " XML zuweisen lo_proxy_xpath->set_source_string( lv_validation ). " XPATH durchführen. Übergabe von Query und Namespace Deklaration lo_proxy_xpath->run( expression = lv_xpath ns_decls = 'd http://schemas.microsoft.com/ado/2007/08/dataservices' ). " Ergebnis des XPath auswerten lo_ixml_node_iterator = lo_proxy_xpath->get_nodes( ). IF lo_ixml_node_iterator IS NOT INITIAL. lo_nodes = lo_ixml_node_iterator->get_next( ). IF lo_nodes IS BOUND. lv_formdigestvalue = lo_nodes->get_value( ). ENDIF. ENDIF. *---------------------------------------------------------------------------------------- * POST Methode zum erstellen eines Listenelements aufrufen *---------------------------------------------------------------------------------------- lv_service = 'http://<url>/sites/<my_site>/_api/web/lists/GetByTitle(' && |'| && 'MyListTitle' && |'| && ')/items'. " eigentlicher Service (volle URL, aber ohne HOST) lo_http_client->request->set_header_field( name = '~request_uri' value = '/sites/<my_site>/_api/web/lists/GetByTitle(' && |'| && 'MyListTitle' && |'| && ')/items' ). " security validation durch Übergabe X-RequestDigest lo_http_client->request->set_header_field( name = 'x-requestdigest' value = lv_formdigestvalue ). " Body lo_http_client->request->append_cdata( ' {"__metadata":{"type":"SP.Data.MyListTitleListItem" },"Title":"Test von SAP"} '). lo_http_client->send( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 ). lo_http_client->receive( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 ). " XML Ergebnis lesen CLEAR lv_result . lv_result = lo_http_client->response->get_data( ). " XML ausgeben CALL FUNCTION 'SRTUTIL_HELPER_XML_SHOW' EXPORTING xdoc = lv_result html = abap_false.
Hinweise
Authentifizierung
Im vorliegenden Beispiel erfolgt die Authentifizierung mittels HTTP Basic Authentication. Die Anmeldedaten lassen sich einfach über den HTTP Header übertragen. Dazu muss zunächst (z.B. Online tool) die Anmeldeinformation im BASE64 Codierung erzeugt werden. Die Anmeldeinformationen wie folgt codieren:
Domain\User:Passwort
HTTP Client
Im obigen Beispiel wird für beide HTTP Requests die gleiche Instant der CL_HTTP_CLIENT Klasse verwendet. Da verschiedene Services aufgerufen werden, muss im Header noch die ~request_uri angepasst werden.
Alternativ kann auch eine neue Instanz der CL_HTTP_CLIENT Klasse verwendet werden.