3

Code:

global class CurrencyExchangeRateScheduler implements Schedulable
{
    public String sessionId;

    public CurrencyExchangeRateScheduler()
    {
        String username = 'username';
        String password = 'password+security_token';

        partnerSoapSforceCom.Soap sp = new partnerSoapSforceCom.Soap();

        partnerSoapSforceCom.LoginResult loginResult = sp.login(username, password);

        sessionId = loginResult.sessionId;

    }

    global void execute(SchedulableContext ctx)
    {
        UpdateDailyCurrencyExchangeRate(sessionId);
    }

    @Future(callout=true)
    public static void UpdateDailyCurrencyExchangeRate(string sessionId)
    {
        system.debug('sessionId: '+sessionId);
        ...

        Http h = new Http();
        HttpRequest req = new HttpRequest();
        req.setHeader('Authorization', 'OAuth ' + sessionId);
        req.setHeader('Content-Type', 'application/json');
        req.setMethod('POST');

        for(CurrencyType currType : currencies)
        {
            if(!currType.IsCorporate)
            {
                req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm() + '/services/data/v28.0/sobjects/CurrencyType/'+currType.id+'?_HttpMethod=PATCH');

                req.setBody('{ "ConversionRate" : 2.5 }');

                HttpResponse response = h.send(req);    

                system.debug('response: '+response);
             }
        }
    }
}

Debug: response: System.HttpResponse[Status=Unauthorized, StatusCode=401]

I also tried with the Authorization header as Bearer + sessionId.

But again the same issue.

The code works perfectly fine when I am loggedin to the org. But when the class is scheduled and I am not loggedin, the response status is 'Unauthorized' and the currency table is not updated.

How can I get the session Id when User is not loggedin?

  • Swati -- you state elsewhere on this page that you tried within your @future to login and get a new sessionId. Please update your post to show how you did that and what results you get as that approach should work – cropredy Sep 16 '14 at 0:42
2

When you schedule a class its execution is postpone to the future time.

While actually executing it the session id you passed may not be valid, so you have 2 options.

1) Extended the session validity by -> Setup->Security Controls-> Session settings and set session time out to MAX (12 hours) (Hopefully your code will be extended in next 12 hours)

2) Modify your UpdateDailyCurrencyExchangeRate method to include login call.

@Future(callout=true)
public static void UpdateDailyCurrencyExchangeRate()
{

    String username = 'username';
    String password = 'password+security_token';

    partnerSoapSforceCom.Soap sp = new partnerSoapSforceCom.Soap();

    partnerSoapSforceCom.LoginResult loginResult = sp.login(username, password);

    sessionId = loginResult.sessionId;

    system.debug('sessionId: '+sessionId);


    Http h = new Http();
    HttpRequest req = new HttpRequest();
    req.setHeader('Authorization', 'OAuth ' + sessionId);
    req.setHeader('Content-Type', 'application/json');
    req.setMethod('POST');

    for(CurrencyType currType : currencies)
    {
        if(!currType.IsCorporate)
        {
            req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm() + '/services/data/v28.0/sobjects/CurrencyType/'+currType.id+'?_HttpMethod=PATCH');

            req.setBody('{ "ConversionRate" : 2.5 }');

            HttpResponse response = h.send(req);    

            system.debug('response: '+response);
         }
    }
}
| improve this answer | |
  • I had already implemented the option 1 but it didn't work. – Swati Sep 17 '14 at 5:59
  • I get a compilation error: Invalid type: partnerSoapSforceCom.Soap – Sander de Jong Dec 13 '16 at 10:44
1

The below link helps you to fix your issue. i too had previously same issue so i started a thread and got the solution. Check it once. SessionID problem in Schedule Batch class

| improve this answer | |
  • This didnt work for me. I tried this solution also. – Swati Sep 15 '14 at 13:20
  • What error you are getting when you try this because it works perfectly for me. – sunny Sep 16 '14 at 6:49
  • I have the same issue with this approach. The code works perfectly fine when I am loggedin to the org. But when the class is scheduled and I am not loggedin, the response status is 'Unauthorized' and the currency table is not updated. – Swati Sep 17 '14 at 5:58
-1

If authentication error occurs as 401-Unauthorized Header, even after using the correct http headers, try replacing the org instance in the endpoint with instance_url returned from authentication token web callout.

        Http h1 = new Http();   
        HttpRequest req1 = new HttpRequest();
        **req1.setHeader('Authorization','Bearer '+ objAuthenticationInfo.access_token);**
        req1.setHeader('Content-Type','application/json');
        req1.setHeader('Accept','application/json');
        req1.setMethod('GET');
        req1.setEndpoint(objAuthenticationInfo.instance_url+'/services/data/v47.0/query/?q=SELECT+name+from+account');
        HttpResponse res1 = h1.send(req1);
| improve this answer | |
  • This does not apply here. The user is not executing their own OAuth flow, and this code seems to be pasted from a very different context. – David Reed Feb 17 at 3:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.