我试图测试salesforce的restapi callout,它通过apex代码进行oauth身份验证,并运行到下面的错误 Line: 12, Column: 1 System.UnexpectedException: java.lang.IllegalArgumentException: invalid start or end
```
public with sharing class RetrieveD365Data {
//@future (callout=true)
public void getD365Data() {
RetrieveAzureToken atz = new RetrieveAzureToken();
String bearer = atz.getAzureData();
Http http = new Http();
HttpRequest req1 = new HttpRequest();
req1.setEndpoint('https://dev-xyz.com/data/Customers');
req1.setMethod('GET');
req1.setHeader('Authorization','Bearer '+bearer);
HttpResponse res1 = http.send(req1); //Error is thrown in this line
System.debug('Response Body=========' + res1.getBody());
}
}
在哪里 `RetrieveAzureToken` 类如下所示,这与预期一样工作,我能够用承载令牌返回响应
global class RetrieveAzureToken {
private final String clientId = 'xxxxxxxxx';
private final String clientSecret = 'xxxxxxxxxx';
public String getAzureData()
{
String reqbody = 'grant_type=client_credentials&client_id='+clientId+'&client_secret='+clientSecret;
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setBody(reqbody);
req.setMethod('POST');
req.setEndpoint('https://login.microsoftonline.com/tenant/oauth2/token');
HttpResponse res = h.send(req);
deserializeResponse resp1 = (deserializeResponse)JSON.deserialize(res.getbody(),deserializeResponse.class);
system.debug('Token from Azure :' + resp1.access_token);
return resp1.access_token;
}
public class deserializeResponse
{
public String token_type;
public String expires_in;
public String ext_expires_in;
public String expires_on;
public String not_before;
public String resource;
public String access_token;
}
}
请让我想想我在这里错过了什么。
1条答案
按热度按时间dzhpxtsq1#
使用基于jersey的rest服务和使用httpurlconnection的客户端,我可以观察到相同的illegalargumentexception。
场景如下:
rest服务定义了一个资源函数
此资源由客户端作为
我的解决方案是将资源更改为:
我认为-没有证明-构造函数notauthorizedexception(string)生成一个没有身份验证模式的www authenitcate头。这会导致在httpurlconnection尝试解析IllegalArgumentException时引发该选项。构造器notauthorizedexception(resonse)只发送一个状态401,没有www身份验证头。