cancel
Showing results for 
Search instead for 
Did you mean: 

Specified HTTP method is not allowed.

prasanna_prabhu2
Explorer
0 Kudos

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

Accepted Solutions (0)

Answers (3)

Answers (3)

Benedikt3
Participant
0 Kudos

Could you provide the generated metaData?

e.g

server/service/$metadata

CRVMANISH
Contributor
0 Kudos

<?xml version="1.0" encoding="utf-8" ?>

- <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData">

- <edmx:DataServices m:DataServiceVersion="2.0">

- <Schema Namespace="ZPM_GIS_INTG_SRV" xml:lang="en" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">

- <EntityType Name="WRK_CTR" sap:content-version="1">

- <Key>

<PropertyRef Name="IsNotifNo" />

</Key>

<Property Name="EResult" Type="Edm.String" Nullable="false" sap:creatable="false" sap:updatable="false" sap:sortable="false" sap:filterable="false" />

<Property Name="IsWrkCtr" Type="Edm.String" Nullable="false" MaxLength="8" sap:label="Work center" sap:creatable="false" sap:sortable="false" sap:filterable="false" />

<Property Name="IsPlant" Type="Edm.String" Nullable="false" MaxLength="4" sap:label="Company Code" sap:creatable="false" sap:sortable="false" sap:filterable="false" />

<Property Name="IsNotifNo" Type="Edm.String" Nullable="false" MaxLength="12" sap:label="Notification" sap:sortable="false" sap:filterable="false" />

</EntityType>

- <EntityContainer Name="ZPM_GIS_INTG_SRV" m:IsDefaultEntityContainer="true">

<EntitySet Name="WRK_CTR" EntityType="ZPM_GIS_INTG_SRV.WRK_CTR" sap:pageable="false" sap:content-version="1" />

</EntityContainer>

</Schema>

</edmx:DataServices>

</edmx:Edmx>

Benedikt3
Participant
0 Kudos

? you have not made the initial post... or?
you don`t have any function import in your metadata. I know nothing about your abap code...

_______
Clear your model cache...

jibin_joy
Contributor
0 Kudos

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

prasanna_prabhu2
Explorer
0 Kudos

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.


jibin_joy
Contributor
0 Kudos

Hi Prasanna,

   can u post ur model class code for function import "SAVE_VARIENT_11 "

Regards,

Jibin Joy

prasanna_prabhu2
Explorer
0 Kudos

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.

jibin_joy
Contributor
0 Kudos

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

prasanna_prabhu2
Explorer
0 Kudos

Hello jibin,

Still same issue persists. Any idea how to overcome this issue..?

Best Regards,

Prasanna

jibin_joy
Contributor
0 Kudos

Hi Prasanna,

let try one more case

set return multiplicity to 1 .

lo_action->set_return_multiplicity(1).

Regards,

Jibin Joy

CRVMANISH
Contributor
0 Kudos

I have same problem did anyone resolve it.

Regards

Manish

rohith_deraje
Employee
Employee
0 Kudos

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

prasanna_prabhu2
Explorer
0 Kudos

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.

"http://ldcigm2.wdf.sap.corp:50018/sap/opu/odata/sap/ZMDG_TEST_SAVE/SAVE_VARIENT_11?COUNTRY='DE'&CITY... Te'"

Where ZMDG_TEST_SAVE  is the service name. And SAVE_VARIENT_11 is Action name.

Best Regards,

Prasanna.