繁体   English   中英

SAPUI5 POST请求中的XML或JSON?

[英]XML or JSON in SAPUI5 POST-request?

我正在尝试通过OData-Rest-API将数据发布到SAP后端系统。 在线上有一些关于如何执行此操作的教程,这些教程还提供了代码示例。 令我困惑的是请求标头中“ Content-Type”的规范与实际提供请求数据的数据格式之间的关系。 一个代码示例来自此站点

    OData.request({  
        requestUri:  "http://gwserver:8000/sap/opu/odata/sap/Z_UI5_USER_MAINT_CM/z_ui5_user_maintCollection",  
        method: "POST",  
        headers: {   
                   "X-Requested-With": "XMLHttpRequest",  
                   "Content-Type": "application/atom+xml",  
                   "DataServiceVersion": "2.0",   
                   "Accept": "application/atom+xml,application/atomsvc+xml,application/xml",  
                   "X-CSRF-Token": header_xcsrf_token  
                  },  
        data:{  
                              username: username_var,  
                              title:title_var,  
                              title_p:title_var,  
                              firstname: firstname_var,  
                              lastname: lastname_var,  
                              password: password_var,  
                              department: department_var,  
                              language: language_var,  
                              telephone: telephone_var,  
                              e_mail: email_var,  
                              city: city_var,  
                              country: country_var,  
                              comm_type:"",  
                              fullname:"",  
                              userid:"",  
                              name:"",  
                              islocked:"",  
                              region: ""  
}},  

现在,此请求中“数据”的格式到底是什么? 它看起来不像XML。 这引出了我的下一个问题,即如何格式化POST请求的数据。 这是我的Web应用程序的controller.js文件中的代码:

         OData.request({
         requestUri: "proxy/http/XXXXXXXXX/sap/opu/odata/XXXXXXXXX",
            method: "POST",
            headers: {
                "X-Requested-With": "XMLHttpRequest",
                "Content-Type": "application/atom+xml",
                "DataServiceVersion": "2.0",
                "MaxDataServiceVersion": "2.0",
                "Pragma": "no-cache",
                "Cache-Control": "no-store, no-cache",                  
                "Accept": "application/atom+xml,application/atomsvc+xml,application/xml",       
                "X-CSRF-Token": "XXXXXXXXXXXXXX"                    
            },
            data: reqData
            },              
            function(data, response){
                alert('Done POSTing.');                     
            },
            function(err){                  
                console.log(err);                   
            });

我从与DHC REST客户端进行的GET请求中获得了有效的X-CSRF-Token。 通过DHC发布到SAP系统可以正常工作。 我应该在reqData变量中存储什么数据格式? 我尝试将原始XML的字符串分配给reqData,但它返回错误消息no handler for data 我的收藏集的一项的XML数据的结构如下:

 <content type="application/xml">
        <m:properties>
            <d:Name m:type="PatientService.PersonName">
                <d:Family>Test10</d:Family>
                <d:First>Test10</d:First>
                <d:Prefix/>
            <d:Title/>
                <d:Affix/>
            </d:Name>
            <d:Gender>Female</d:Gender>
            <d:BirthDate m:null="true"/>
            <d:isActive>false</d:isActive>
            <d:NationalityISO>DE</d:NationalityISO>
            <d:BirthCountryISO>DE</d:BirthCountryISO>
            <d:BirthPlace>Hintertupfing</d:BirthPlace>
            <d:BirthName/>
        </m:properties>
    </content>

我已经尝试了五种不同的XML到JSON转换器来转换XML内容,它不断抛出诸如

DOMException: Failed to execute 'createElementNS' on 'Document': The    qualified name provided ('d:_m:type') contains multiple colons.(…)

并将我的数据存储在这样的对象中:

{                       
                        Family: "Test10",
                        First: "Anna10",
                        Nationality: "DE",
                        BirthCountry: "DE",
                        BirthPlace: "Hintertupfing"
                        }

也不起作用。

你为什么写你的请求手册?

//insert request
var oDataJSON = {
    "Name": {"Family": "Schultz", "First": "Mandy"},
    "Gender": "Female",
    "isActive": true
}
oDataModel.insert(oDataJSON);

//merge request
oDataJSON = {
    "Name": {"Family": "Schultz", "First": "Mandy"},
    "isActive", false
};
oDataModel.update(oDataJSON);

现在,您可以使用Chrome开发者工具分析POST请求

基于此方法dataJS文档

data属性定义以中间格式定义的请求的有效负载。 该请求作为输入传递到处理程序对象,该对象将请求有效负载序列化为适当的有线格式; 由请求标头控制。 然后将转换后的数据存储在body属性中。 最后,将修改后的请求对象传递到基础网络堆栈。

按照我的理解, data参数需要是键-值对的列表,如上面的示例所示。 发送请求后, OData.request方法将以标头中指定的格式序列化此数据。

我的格式正确。 有效负载中的嵌套XML结构是通过将数据嵌套在请求规范中来实现的,如下所示:

data: {
        Name: {Family: "Schultz", First: "Mandy"}
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM