使用SharePoint Rest API从SAP服务器访问时出现401错误求助
1. 切换OAuth 2.0认证方式
SharePoint Online 默认禁用基本认证,你当前使用的authenticate方法属于基本认证,无法通过验证,需改用OAuth 2.0:
- 先在Azure AD注册应用,获取客户端ID、客户端密钥、租户ID
- 在ABAP中先请求获取访问令牌:
DATA: lo_http_client TYPE REF TO if_http_client, lv_token_url TYPE string, lv_post_data TYPE string, lv_token TYPE string. lv_token_url = 'https://login.microsoftonline.com/[你的租户ID]/oauth2/v2.0/token'. cl_http_client=>create_by_url( EXPORTING url = lv_token_url IMPORTING client = lo_http_client EXCEPTIONS OTHERS = 4 ). lo_http_client->request->set_method( 'POST' ). lo_http_client->request->set_content_type( 'application/x-www-form-urlencoded' ). lv_post_data = 'grant_type=client_credentials' && '&client_id=[你的客户端ID]' && '&client_secret=[你的客户端密钥]' && '&scope=https://[你的租户域名].sharepoint.com/.default'. lo_http_client->request->set_data( lv_post_data ). lo_http_client->send( EXCEPTIONS OTHERS = 2 ). lo_http_client->receive( EXCEPTIONS OTHERS = 3 ). * 解析JSON获取access_token DATA(lo_json_reader) = cl_sxml_string_reader=>create( lo_http_client->response->get_data( ) ). DATA(lo_json_parser) = cl_abap_json_parser=>create( lo_json_reader ). DATA(lt_json_nodes) TYPE abap_json_table. lo_json_parser->parse( CHANGING data = lt_json_nodes ). READ TABLE lt_json_nodes INTO DATA(ls_token_node) WITH KEY name = 'access_token'. IF sy-subrc = 0. lv_token = ls_token_node-value. ENDIF.
- 调用SharePoint API时,在请求头添加令牌:
lo_http_client->request->set_header_field( name = 'Authorization' value = |Bearer { lv_token }| ).
2. 本地SharePoint的基本认证检查(仅适用于本地部署)
如果是SharePoint本地服务器,需确认:
- IIS站点已启用基本认证:在对应站点的认证设置中开启
- 用户权限:确保该用户不仅有站点访问权限,还对目标列表
Ressource有读取权限 - URL准确性:确认
MYURL是完整站点地址(如https://xxx.local/sites/你的站点),列表名称拼写完全匹配(区分大小写)
3. SAP服务器网络与代理设置
- 验证网络连通性:用事务码
SM59创建HTTP连接测试SharePoint URL,或通过服务器命令行ping目标地址 - 配置代理:如果SAP服务器需通过代理访问外网,添加代理设置:
lo_http_client->set_proxy( host = '代理服务器地址' port = '代理端口' username = '代理用户名' " 按需填写 password = '代理密码' ).
4. 补充必要请求头
SharePoint REST API要求特定请求头,添加以下字段:
lo_http_client->request->set_header_field( name = 'Accept' value = 'application/json;odata=verbose' ). lo_http_client->request->set_header_field( name = 'Content-Type' value = 'application/json;odata=verbose' ).
内容的提问来源于stack exchange,提问作者merou
相关产品推荐
相关产品推荐

