on 01-03-2013 9:40 AM
Hello All,
I am implementing the method EXECUTE_ACTION , with HTTP method 'POST'. When i execute the service in the browser i get the error saying
'The specified HTTP method is not allowed for the resource identified by the Data Service Request URI".
Can any one help me out how to resolve this issue.
When i run the same URL in the REST client with the x-csrf token it says "CSRF token validation failed".
Thanks in Advance
Prasanna
Could you provide the generated metaData?
e.g
server/service/$metadata
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
<?xml version="1.0" encoding="utf-8" ?>
</EntityType>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
Hi Prasanna,
Are u using SEGW Tool for generation ?
If yes,
Can u post me screen shot for that function Import.
If No,
Can u post me that code.
Regards,
Jibin Joy
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Jibin,
Thanks a lot for the response.
I am not using SEGW tool. Please find below code of the data provider class. The metadata works fine.
method /IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION.
data: lo_save TYPE REF TO /iwbep/if_mgw_appl_srv_runtime.
" ls_rt_save TYPE zcl_model_save=>
case iv_action_name.
WHen 'SAVE_VARIENT_11'.
create:
OBJECT lo_save TYPE zcl_data_save.
me->GET_SAVED_DATA( EXPORTING iv_action_name = iv_action_name
it_parameter = it_parameter
importing er_data = er_data ).
ENDCASE.
endmethod
*********************************************
method GET_SAVED_DATA.
DATA: WA_SAVE TYPE ZTEST_SAVE,
LV_CITY1 TYPE ZTEST_SAVE-CITY1,
LV_COUNTRY TYPE ZTEST_SAVE-COUNTRY,
LV_KUNNR TYPE ZTEST_SAVE-KUNNR,
LV_NAME1 TYPE ZTEST_SAVE-NAME1,
LV_NAME2 TYPE ZTEST_SAVE-NAME2,
LV_REGION TYPE ZTEST_SAVE-REGION,
lv_kline TYPE /iwbep/s_mgw_name_value_pair,
lv_lines TYPE I.
FIELD-SYMBOLS: <FS_SAVE> TYPE ZTEST_SAVE.
IF iv_action_name EQ 'SAVE_VARIENT_11'.
CREATE DATA er_data TYPE ZTEST_SAVE.
ASSIGN er_data->* TO <FS_SAVE>.
IF it_parameter IS NOT INITIAL.
DESCRIBE TABLE it_parameter LINES lv_lines.
READ TABLE it_parameter INTO lv_kline WITH KEY NAME = 'CITY1'.
IF SY-SUBRC = 0.
LV_CITY1 = lv_kline-VALUE.
ENDIF.
READ TABLE it_parameter INTO lv_kline WITH KEY NAME = 'COUNTRY'.
IF SY-subrc = 0.
LV_COUNTRY = lv_kline-VALUE.
ENDIF.
READ TABLE it_parameter INTO lv_kline WITH KEY NAME = 'KUNNR'.
IF SY-SUBRC = 0.
LV_KUNNR = lv_kline-VALUE.
ENDIF.
READ TABLE it_parameter INTO lv_kline WITH KEY NAME = 'NAME1'.
IF sy-subrc = 0.
LV_NAME1 = lv_kline-VALUE.
ENDIF.
"find the attributes saved
SELECT SINGLE * FROM ZTEST_SAVE INTO WA_SAVE
WHERE CITY1 = LV_CITY1 AND COUNTRY = LV_COUNTRY AND KUNNR = LV_KUNNR AND NAME1 = LV_NAME1.
IF sy-subrc = 0.
WA_SAVE-saved = 'X'.
UPDATE ZTEST_SAVE FROM WA_SAVE.
"RETURN SAVED RESULT TO table.
<FS_SAVE>-CITY1 = WA_SAVE-CITY1.
<FS_SAVE>-COUNTRY = WA_SAVE-COUNTRY.
<FS_SAVE>-KUNNR = WA_SAVE-KUNNR.
<FS_SAVE>-NAME1 = WA_SAVE-NAME1.
CONCATENATE ` varient for ` <FS_SAVE>-CITY1
<FS_SAVE>-COUNTRY
<FS_SAVE>-KUNNR
<FS_SAVE>-NAME1
` combination has been saved. `
INTO <FS_SAVE>-TITLE.
ENDIF.
ENDIF.
ENDIF.
Do revert back for any queries.
Best Regards,
Prasanna.
Model class code:
*****************************
DATA:lo_entity_type TYPE REF TO /iwbep/if_mgw_odata_entity_typ,
LO_PROPERTY TYPE REF TO /iwbep/if_mgw_odata_property,
lt_attr TYPE TABLE OF MDGHDB002D,
ls_attr TYPE MDGHDB002D,
lv_attr_name TYPE /IWBEP/MED_EXTERNAL_NAME,
lv_field_name TYPE FIELDNAME,
lo_annotation TYPE REF TO /iwbep/if_mgw_odata_annotation,
lv_child TYPE /IWBEP/MED_ANNOTATION_VALUE,
lv_data_type TYPE string,
Lt_result_tab TYPE mdg_gw_tt_hana_map,
lt_tab TYPE MDG_GW_TS_HANA_MAP,
lt_DFIES TYPE TABLE OF DFIES,
Ls_DFIES TYPE DFIES,
Lt_TABLE TYPE DDOBJNAME,
MV_HVIEWNAME TYPE MDG_HVIEWNAME,
MV_ENTITYNAME TYPE /IWBEP/MED_EXTERNAL_NAME,
lo_action type ref to /iwbep/if_mgw_odata_action,
lo_parameter type ref to /iwbep/if_mgw_odata_parameter.
"Get the HANA view name
mv_entityname = 'CUSTOMER'.
SELECT HANA_VIEWNAME FROM MDGHDB002H INTO mv_hviewname WHERE TECHNICAL_NAME = mv_entityname.
" Check for HANA connection
CL_MDG_GW_HANA_UTILITY=>SET_CONN_TEST( iv_db_conn = IF_MDG_GW_HANA_CONST=>co_hana_conn
iv_schema_name = IF_MDG_GW_HANA_CONST=>co_hana_schema
iv_tab_name = mv_hviewname ).
"Get the attributes from the table based on entity name
SELECT * FROM MDGHDB002D INTO TABLE lt_attr WHERE TECHNICAL_NAME = mv_entityname.
ENDSELECT.
IF SY-SUBRC = 0.
"Create entity
CALL METHOD model->CREATE_ENTITY_TYPE( EXPORTING IV_ENTITY_TYPE_NAME = MV_ENTITYNAME RECEIVING RO_ENTITY = lo_entity_type ).
lo_action = model->CREATE_ACTION( 'SAVE_VARIENT_11' ).
LOOP AT lt_attr INTO ls_attr.
CLEAR lo_property.
lv_attr_name = ls_attr-ATTRIBUTE.
lv_field_name = lv_attr_name.
IF lv_field_name = 'COUNT'.
lv_data_type = 'I'.
LO_PROPERTY = lo_entity_type->CREATE_PROPERTY( iv_property_name = lv_attr_name
iv_abap_fieldname = lv_field_name ).
lo_property->BIND_DATA_ELEMENT( EXPORTING IV_ELEMENT_NAME = lv_data_type ).
ELSE.
LO_PROPERTY = lo_entity_type->CREATE_PROPERTY( iv_property_name = lv_attr_name
iv_abap_fieldname = lv_field_name ).
"Get the Data type of the field name(To be done) work around
" SELECT ROLLNAME FROM DD03L INTO lv_data_type WHERE FIELDNAME = lv_field_name.
CALL METHOD CL_MDG_GW_HANA_UTILITY=>get_abp_fldnames_from_hdb_view
EXPORTING
IV_VIEW_NAME = mv_hviewname
IMPORTING
ET_RESULT_TAB = Lt_result_tab.
READ TABLE lt_result_tab INTO Lt_TAB WITH KEY HANA_FIELD_NAME = lv_field_name.
lt_table = lt_tab-abap_table_name.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
TABNAME = Lt_TABLE
FIELDNAME = lv_field_name
* LANGU = SY-LANGU
* LFIELDNAME = ' '
* ALL_TYPES = ' '
* GROUP_NAMES = ' '
* UCLEN =
* DO_NOT_WRITE = ' '
* IMPORTING
* X030L_WA =
* DDOBJTYPE =
* DFIES_WA =
* LINES_DESCR =
TABLES
DFIES_TAB = lt_DFIES
* FIXED_VALUES =
* EXCEPTIONS
* NOT_FOUND = 1
* INTERNAL_ERROR = 2
* OTHERS = 3
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
READ TABLE lt_DFIES INTO Ls_DFIES WITH KEY tabname = lt_table.
lv_data_type = Ls_DFIES-ROLLNAME.
IF ls_attr-PARENT IS NOT INITIAL.
CLEAR lv_child.
lv_child = ls_attr-PARENT.
lo_annotation = lo_property->/IWBEP/IF_MGW_ODATA_ANNOTATABL~CREATE_ANNOTATION( iv_annotation_namespace = /iwbep/if_mgw_med_odata_types=>gc_sap_namespace ).
lo_annotation->add( iv_key = 'Child'
iv_value = lv_CHILD ).
ENDIF.
"Bind the Data element
lo_property->BIND_DATA_ELEMENT( EXPORTING IV_ELEMENT_NAME = lv_data_type ).
lo_property->SET_IS_KEY( ).
"Save implementation
lo_action->SET_RETURN_ENTITY_TYPE( MV_ENTITYNAME ).
lo_action->SET_HTTP_METHOD( 'POST' ).
lo_action->set_return_multiplicity( cardinality_entity ).
ENDIF.
ENDLOOP.
lo_parameter = lo_action->create_input_parameter( iv_parameter_name = 'COUNTRY'
iv_abap_fieldname = 'COUNTRY' ).
lo_parameter->BIND_DATA_ELEMENT( EXPORTING IV_ELEMENT_NAME = 'LAND1' ).
ENDIF.
Hi ,
1. Write this Code outside the loop
|
|
|
"Save implementation
lo_action->SET_RETURN_ENTITY_TYPE( MV_ENTITYNAME ).
lo_action->SET_HTTP_METHOD( 'POST' ).
lo_action->set_return_multiplicity( cardinality_entity ).
2. Add this code also after above code
lo_action->set_action_for( MV_ENTITYNAME ).
3. i think cardinality_entity value will be 1 .
Regards,
Jibin Joy
Hi Prasanna,
Issue1:'The specified HTTP method is not allowed for the resource identified by the Data Service Request URI" ,
check if you are passing the right URL. The collection should support POST operation.
Issue2: oData uses XSRF token. When you do a GET, send a header "x-csrf-token" value "fetch"
You will get back the token in the GET response header.
When you perform POST, you should send the same token in the header "x-csrf-token" . POST request will be processed only if the token matches.
Regards
Rohith
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Rohith,
Thanks a lot for quick response.
Issue2: I did send the "x-csrf-token" back when i am doing POST, which i fetched from the GET.
Issue 1. The URL looks like this.
Where ZMDG_TEST_SAVE is the service name. And SAVE_VARIENT_11 is Action name.
Best Regards,
Prasanna.
User | Count |
---|---|
81 | |
25 | |
12 | |
9 | |
7 | |
6 | |
5 | |
5 | |
4 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.