Portal login error

493
2
Jump to solution
10-29-2020 06:13 AM
CliveSwan
Occasional Contributor II

Greetings,

I am using the ESRI sample code to generate a token (Scripting with the ArcGIS REST API—Portal for ArcGIS | Documentation for ArcGIS Enterprise ), getting an expected type error??

Error is Expected type 'Optional[bytes]', got 'str' instead??

I updated the code for Python 3.

### Python 3.8

def generateToken(username, password, portalUrl:(
'''Retrieves a token to be used with API requests.'''
portalUrl = myurl
username = myuser
password = mypassword

parameters = urllib.parse.urlencode({'username' : username,
'password' : password,
'client' : 'referer',
'referer' : portalUrl,
'expiration' : 60,
'f' : 'json'})
print("Read parameters")
response = urllib.request.urlopen(portalUrl + '/sharing/rest/generateToken?', parameters).read()

print("response")

try:
jsonResponse = json.loads(response)
if 'token' in jsonResponse:
return jsonResponse['token']
elif 'error' in jsonResponse:
print(jsonResponse['error']['message'])
for detail in jsonResponse['error']['details']:
print(detail)
except ValueError:
print('An unspecified error occurred.')

## End

All I get is the error message:
Expected type 'Optional[bytes]', got 'str' instead

Appreciate any assistance and pointers.

Regards,

Clive

0 Kudos
1 Solution

Accepted Solutions
MehdiPira1
Esri Contributor

Hi Clive Swan‌,

You need to add encode(“utf-8”) at the end of line 14.

The code will be like so:

import urllib
import json
def generateToken(username, password, portalUrl):
    '''Retrieves a token to be used with API requests.
    portalUrl = myurl
    username = myuser
    password = mypassword'''

    parameters = urllib.parse.urlencode({'username' : username,
    'password' : password,
    'client' : 'referer',
    'referer' : portalUrl,
    'expiration' : 60,
    'f' : 'json'}).encode("utf-8")
    
    print("Read parameters")
    response = urllib.request.urlopen(portalUrl + '/sharing/rest/generateToken?', parameters).read()

    print("response")

    try:
        jsonResponse = json.loads(response)
        if 'token' in jsonResponse:
            return jsonResponse['token']
        elif 'error' in jsonResponse:
            print(jsonResponse['error']['message'])
        for detail in jsonResponse['error']['details']:
            print(detail)
    except ValueError:
        print('An unspecified error occurred.')

------------------------------------------------------------------------------------------------------------------------------------

Please mark as helpful if you find it helpful. If it answered your question please mark it as answered.

View solution in original post

2 Replies
MehdiPira1
Esri Contributor

Hi Clive Swan‌,

You need to add encode(“utf-8”) at the end of line 14.

The code will be like so:

import urllib
import json
def generateToken(username, password, portalUrl):
    '''Retrieves a token to be used with API requests.
    portalUrl = myurl
    username = myuser
    password = mypassword'''

    parameters = urllib.parse.urlencode({'username' : username,
    'password' : password,
    'client' : 'referer',
    'referer' : portalUrl,
    'expiration' : 60,
    'f' : 'json'}).encode("utf-8")
    
    print("Read parameters")
    response = urllib.request.urlopen(portalUrl + '/sharing/rest/generateToken?', parameters).read()

    print("response")

    try:
        jsonResponse = json.loads(response)
        if 'token' in jsonResponse:
            return jsonResponse['token']
        elif 'error' in jsonResponse:
            print(jsonResponse['error']['message'])
        for detail in jsonResponse['error']['details']:
            print(detail)
    except ValueError:
        print('An unspecified error occurred.')

------------------------------------------------------------------------------------------------------------------------------------

Please mark as helpful if you find it helpful. If it answered your question please mark it as answered.

CliveSwan
Occasional Contributor II

Thanks for the input on the  .encode(utf-8)

I ran the code several times, nothing happened.. NOT even errors.

Then I remembered to add:  generateToken(username, password, portalUrl ) at the end of the code.

0 Kudos