Code: Alles auswählen.
METHOD escape_param.
result = escape( val = parameter
format = cl_abap_format=>e_url_full ).
ENDMETHOD.
METHOD build_url.
DATA(url_params) = '?UstId_1=' && escape_param( mv_own_vat )
&& '&UstId_2=' && escape_param( customer_data->stceg )
&& '&Firmenname=' && escape_param( customer_data->name1 )
&& '&Ort=' && escape_param( customer_data->ort01 )
&& '&PLZ=' && escape_param( customer_data->pstlz )
&& '&Strasse=' && escape_param( customer_data->stras )
&& '&Druck=' && escape_param( c_no ).
result = c_api_base_url && url_params.
ENDMETHOD.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Gokar
Code: Alles auswählen.
"Daten, HTTP-Antwort
TYPES: BEGIN OF ty_s_text,
line(9999),
END OF ty_s_text.
Code: Alles auswählen.
DATA: t_response_xml TYPE STANDARD TABLE OF ty_s_text WITH DEFAULT KEY.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Gokar
Danke für den Kommentar.a-dead-trousers hat geschrieben: ↑05.08.2020 10:32Ich würde dir anstatt des Funktionsbausteins, die Klasse CL_HTTP_CLIENT empfehlen. Da kannst du dir die Daten aus dem Response z.B. als XSTRING zurückliefern lassen und die Konvertierung dann über CL_ABAP_CONV_IN_CE selbst erledigen.
Das Problem beim HTTP_GET mit der Codepage ist, wenn du ein CHAR-Feld angibst, wird implizit die Codepage des Applikationsservers als Zielformat angenommen. Wenn nun die Gegenstelle eine "falsche" Codierung im Header angibt oder sonst irgendwo beim Import ein Fehler auftritt entsteht ziemlicher Kauderwelsch.
Ich hatte mal so ein ähnliches Problem bei der FTP-Kommunikation:
Der Server hat alles in UTF-8 übermittelt.
Die SAP Bausteine haben es von der Konsole aber per IS0-8859-1 ausgelesen und da wir Unicode einsetzen ist das Ergebnis dann kaum wiederzuerkennen gewesen.
Ich musste dann mit CL_ABAP_CONV_OUT_CE den Unicode Text unter Angabe der eigentlich falschen Codepage IS0-8859-1 in einen XSTRING zurückwandeln und daraus dann mit CL_ABAP_CONV_IN_CE als UTF-8 wieder importieren.
Code: Alles auswählen.
DATA: i_r_exception TYPE REF TO cx_root.
DATA: i_r_client TYPE REF TO if_http_client.
"...
TRY.
"Client-Objekt erzeugen
cl_http_client=>create_by_url(
EXPORTING
url = i_s_request_data-url_no_special_signs
IMPORTING
client = i_r_client
).
IF i_r_client IS BOUND.
"HTTP GET senden, evtl. Timeout angeben
i_r_client->send( timeout = if_http_client=>co_timeout_default ).
"Response lesen
i_r_client->receive( ).
"HTTP Return Code holen
i_r_client->response->get_status(
IMPORTING
code = i_s_request_data-status_http_code
reason = i_s_request_data-status_http_text
).
"Header-Daten der Übertragung
i_r_client->response->get_header_fields( CHANGING fields = i_s_request_data-t_header_fields ).
"Wenn Status 200 (Ok)
IF i_s_request_data-status_http_code EQ 200.
"HTTP Body als Character-Daten
i_v_string1 = i_r_client->response->get_cdata( ).
"Zeilenweise in interne Tabelle auftrennen
SPLIT i_v_string1 AT cl_abap_char_utilities=>newline INTO TABLE i_s_request_data-t_response_xml IN CHARACTER MODE.
ENDIF.
ENDIF.
CATCH cx_root INTO i_r_exception.
i_v_string1 = i_r_exception->get_text( ).
CONCATENATE 'Fehler bei HTTP-Anfrage:' i_v_string1 INTO i_v_string1 SEPARATED BY space.
MOVE i_v_string1 TO i_s_request_data-status_http.
me->add_message( EXPORTING p_i_v_text = i_s_request_data-status_http
p_i_v_type = 'E'
CHANGING p_c_s_data_debitor = p_c_l_data_debitor ).
ENDTRY.
Code: Alles auswählen.
DATA: r_client TYPE REF TO if_http_client.
DATA: r_conv TYPE REF TO cl_abap_conv_in_ce.
DATA: v_xstring TYPE xstring.
DATA: v_string TYPE string.
"HTTP-Anfrage, Client-Objekt erzeugen, etc.
cl_http_client=>create_by_url( EXPORTING url = 'https://...' IMPORTING client = r_client ).
"...
"HTTP Body binär
v_xstring = r_client->response->get_data( ).
"xstring -> string - UTF-8
r_conv = cl_abap_conv_in_ce=>create( input = v_xstring encoding = 'UTF-8' ).
r_conv->read( IMPORTING data = v_string ). "<-- Sonderzeichen 'à' = O.K.
"xstring -> string - iso-8859-1
r_conv = cl_abap_conv_in_ce=>create( input = v_xstring encoding = '1100' ).
r_conv->read( IMPORTING data = v_string ). "<-- Sonderzeichen 'à' entspricht jetzt: 'Ã '
Das entspricht also genau dem Verhalten, das du zu Anfang hattest und ist für mich ein guter Beleg dafür, das die "alten" Sachen in ABAP meist nicht für "moderne" Softwareumgebungen geeignet bzw. ausgelegt sind.Gokar hat geschrieben: ↑05.08.2020 18:01Verwendet man anstatt der Methode IF_HTTP_RESPONSE->GET_CDATA( ) die Methode GET_DATA( ) und liest den zurückgelieferten XSTRING mit Endcoding 'UTF-8' dann passen die Sonderzeichen (= 'à'). Liest man den XSTRING mit SAP-Encoding '1100' (iso-8859-1) dann kommt auch wieder anstatt 'à' zurück: 'Ã '
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Gokar
Yep, ich benutze die Klasse cl_ixml zum Parsen der Response und muss keinerlei Konvertierungs-Unfug tätigen.a-dead-trousers hat geschrieben: ↑05.08.2020 18:21Das entspricht also genau dem Verhalten, das du zu Anfang hattest und ist für mich ein guter Beleg dafür, das die "alten" Sachen in ABAP meist nicht für "moderne" Softwareumgebungen geeignet bzw. ausgelegt sind.
In vielen (den meisten?) Fällen hat die SAP aber schon nachgebessert und bietet die passenden Alternativen an:
CL_DD_DOCUMENT => IF_IXML
HTTP_GET => CL_HTTP_CLIENT
SO_NEW_DOCUMENT_ATT_SEND_API1 => CL_BCS
Danke, werde ich mir mal vormerken, ist sicherlich noch hilfreich! :)a-dead-trousers hat geschrieben: ↑05.08.2020 18:21CL_DD_DOCUMENT => IF_IXML
HTTP_GET => CL_HTTP_CLIENT
SO_NEW_DOCUMENT_ATT_SEND_API1 => CL_BCS