我正在尝试将业务中心与共享点连接起来,我已经在邮递员中完成了,它工作得很好,GET 和 POST。 但现在我尝试在 BC 上执行此操作,令牌已创建但无法正常工作,我认为连接或 URL 存在一些问题。
codeunit 50100 "APISharePoint"
{
var
OAuth2: Codeunit OAuth2;
ClientIdTxt: Label '4d148348-137a-40e7-b20c-a458c2a03c65', Locked = true;
ClientSecret: Label 'Ai2pOhE7yeZ8WRxrwSrHdpVtNqJg51tg2X+s8CJDLy4=', Locked = true;
ResourceUrlTxt: Label 'https://crmbc384959.sharepoint.com', Locked = true;
OAuthAuthorityUrlTxt: Label 'https://login.microsoftonline.com/ec36749a-af47-4f04-892c-98666b6cac1b/oauth2/v2.0/token', Locked = true;
procedure GetAccessToken(): Text
var
PromptInteraction: Enum "Prompt Interaction";
AccessToken: Text;
AuthCodeError: Text;
RedirectURLTxt: Text;
begin
// OAuth2.GetDefaultRedirectURL(RedirectURLTxt);
RedirectURLTxt := 'https://localhost';
if OAuth2.AcquireTokenWithClientCredentials(ClientIdTxt, ClientSecret, OAuthAuthorityUrlTxt, RedirectURLTxt, ResourceURLTxt, AccessToken) then
exit(AccessToken)
else
exit('');
end;
procedure HttpGet(AccessToken: Text; Url: Text /*var JResponse: JsonObject*/): Boolean
var
Client: HttpClient;
Headers: HttpHeaders;
RequestMessage: HttpRequestMessage;
ResponseMessage: HttpResponseMessage;
RequestContent: HttpContent;
ResponseText: Text;
IsSucces: Boolean;
begin
Headers := Client.DefaultRequestHeaders();
Headers.Add('Authorization', StrSubstNo('Bearer %1', AccessToken));
Headers.Add('Accept', 'application/json;odata=verbose');
RequestMessage.Content.GetHeaders(Headers); //asd
Headers.Remove('Content-Type');
Headers.Add('Content-Type', 'application/json;odata=verbose');
RequestMessage.SetRequestUri(Url);
RequestMessage.Method := 'GET';
if Client.Send(RequestMessage, ResponseMessage) then
if ResponseMessage.IsSuccessStatusCode() then begin
if ResponseMessage.Content.ReadAs(ResponseText) then
IsSucces := true;
// end else
// ResponseMessage.Content.ReadAs(ResponseText);
// JResponse.ReadFrom(ResponseText);
exit(IsSucces);
end;
end;
也许您的问题是 GET 与请求内容的组合。 据我所知,.NET 中 HttpClient 的底层实现不支持带有请求内容的 GET。您可以在这里阅读更多相关信息:如何使用 HttpClient 在 GET 请求正文中发送内容?
也许您可以尝试 GET,而不在内容上设置内容类型,或者改用 POST 或 PUT。
但是您没有提供错误消息,所以这只是一个猜测。
这肯定太晚了,我希望你已经找到了解决方案:)。 如果不是,某些 SharePoint 范围不接受仅使用客户端和密码的应用程序注册(Project Online 就是这种情况)。 您需要通过 SSL 证书进行令牌请求。 创建和设置证书的过程如下: https://anupamchand.medium.com/azure-active-directory-authentication-using-client-certificates-4274932a5061 以下代码将为您提供一个可用的令牌:
过程 AcquireTokenOAuth2(var AuthError: text) AccessToken: Text
变量
客户端:HttpClient;
请求消息:HttpRequestMessage;
内容:HttpContent;
标头:HttpHeaders;
响应消息:HttpResponseMessage;
Uri:文本;
请求正文:文本;
响应正文:文本;
OAuthClientId:文本;
OAuthClientSecret:文本;
Json:JsonObject;
开始
Uri := 'https://login.microsoftonline.com//oauth2/v2.0/token';
RequestMessage.Method('POST');
RequestMessage.SetRequestUri(Uri);
RequestBody := 'scope=https://.sharepoint.com/.default&client_id=&client_assertion_type=urn:ietf:params:oauth:client-assertion-
类型:jwt-bearer&client_assertion=
Client.Post(Uri, Content, ResponseMessage);
Content := ResponseMessage.Content();
Content.ReadAs(ResponseBody);
if not ResponseMessage.IsSuccessStatusCode() then begin
AuthError := ResponseBody;
exit;
end;
Json.ReadFrom(ResponseBody);
AccessToken := GetTextValueForKeyInJson(Json, 'access_token');
end;