Testing the OpenCalais web service

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Testing the OpenCalais web service

hernanmd
I'm testing the OpenCalais web service. This is a web service which
needs an API key to be used (registering takes only 1 minute in
http://www.opencalais.com/APIkey). To check the service first I've used
a Python script, taken from [1]

import httplib2
import json
LOCAL_API_KEY = '' # Aquire this by registering at the Calais site
CALAIS_TAG_API = 'http://api.opencalais.com/tag/rs/enrich'
# Some sample text from a news story to pass to Calais for analysis
test_body = """
Some huge announcements were made at Apple's Worldwide Developer's
Conference Monday, including the new mobile operating system iOS 5, PC
software OS X Lion, and the unveiling of the iCloud.
"""
# header information need by Calais. For more info see
http://www.opencalais.com/documentation/calais-web-service-api/api-invocation/rest
headers = {
     'x-calais-licenseID': LOCAL_API_KEY,
     'content-type': 'text/raw',
     'accept': 'application/json',
}
# Create your http object
http = httplib2.Http()
# Make the http post request, passing the body and headers as needed.
response, content = http.request(CALAIS_TAG_API, 'POST',
headers=headers, body=test_body)
jcontent = json.loads(content) # Parse the json return into a python dict
print json.dumps(jcontent, indent=4) # Pretty print the resulting
dictionary returned.

The Python script works fine for me. I have tried to translate the code
above, but my version in Pharo 2.0 using Zinc returns "I Read a
ZnResponse(415 Unsupported Media Type text/plain 365B)"

| httpClient localApiKey |
localApiKey := ''. " my API key "
httpClient := ZnClient new
                logToTranscript;
                url: 'http://api.opencalais.com/tag/rs/enrich';
                method: #POST;
                headerAt: 'x-calais-licenseID' put: localApiKey;
                headerAt: 'accept' put: 'application/json';
                headerAt: 'content-Type' put: 'text/raw';
                contents: 'Some huge announcements were made at Apple''s Worldwide
Developer''s Conference Monday, including the new mobile operating
system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.
httpClient execute.

Additionally the request returns the following message:

'Document conversion error. Please make sure that the content-type
(passed through the paramsXML) matches this document contents.
[ErrorMessage:
com.clearforest.platform.system.CLFRuntimeException: There is no
converter for this type of URI
"file:/C:/CLFSW/v71/ct/bin/../../../v71/ct/var/dptemp/prvt/228295-app9/dp/papi/data/1374378595643-DF317E60-6634505.asc"
        ]'

 From what I could see, a difference is the 'text/raw'
content-type is passed in Python's httplib2, but in Zinc is overriding
by 'text/plain' it in #acceptEntityDescription: ? Any hints?

Hernán

[1]
http://www.flagonwiththedragon.com/2011/06/08/dead-simple-python-calls-to-open-calais-api/



Reply | Threaded
Open this post in threaded view
|

Re: Testing the OpenCalais web service

Sven Van Caekenberghe-2
Hi Hernán,

It is great that you are using ZnClient and are providing feedback.

On 21 Jul 2013, at 08:58, Hernán Morales Durand <[hidden email]> wrote:

> I'm testing the OpenCalais web service. This is a web service which
> needs an API key to be used (registering takes only 1 minute in
> http://www.opencalais.com/APIkey). To check the service first I've used
> a Python script, taken from [1]
>
> import httplib2
> import json
> LOCAL_API_KEY = '' # Aquire this by registering at the Calais site
> CALAIS_TAG_API = 'http://api.opencalais.com/tag/rs/enrich'
> # Some sample text from a news story to pass to Calais for analysis
> test_body = """
> Some huge announcements were made at Apple's Worldwide Developer's
> Conference Monday, including the new mobile operating system iOS 5, PC
> software OS X Lion, and the unveiling of the iCloud.
> """
> # header information need by Calais. For more info see
> http://www.opencalais.com/documentation/calais-web-service-api/api-invocation/rest
> headers = {
>    'x-calais-licenseID': LOCAL_API_KEY,
>    'content-type': 'text/raw',
>    'accept': 'application/json',
> }
> # Create your http object
> http = httplib2.Http()
> # Make the http post request, passing the body and headers as needed.
> response, content = http.request(CALAIS_TAG_API, 'POST',
> headers=headers, body=test_body)
> jcontent = json.loads(content) # Parse the json return into a python dict
> print json.dumps(jcontent, indent=4) # Pretty print the resulting
> dictionary returned.
>
> The Python script works fine for me. I have tried to translate the code
> above, but my version in Pharo 2.0 using Zinc returns "I Read a
> ZnResponse(415 Unsupported Media Type text/plain 365B)"
>
> | httpClient localApiKey |
> localApiKey := ''. " my API key "
> httpClient := ZnClient new
> logToTranscript;
> url: 'http://api.opencalais.com/tag/rs/enrich';
> method: #POST;
> headerAt: 'x-calais-licenseID' put: localApiKey;
> headerAt: 'accept' put: 'application/json';
> headerAt: 'content-Type' put: 'text/raw';
> contents: 'Some huge announcements were made at Apple''s Worldwide
> Developer''s Conference Monday, including the new mobile operating
> system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.
> httpClient execute.
>
> Additionally the request returns the following message:
>
> 'Document conversion error. Please make sure that the content-type
> (passed through the paramsXML) matches this document contents.
> [ErrorMessage:
> com.clearforest.platform.system.CLFRuntimeException: There is no
> converter for this type of URI
> "file:/C:/CLFSW/v71/ct/bin/../../../v71/ct/var/dptemp/prvt/228295-app9/dp/papi/data/1374378595643-DF317E60-6634505.asc"
> ]'
>
> From what I could see, a difference is the 'text/raw'
> content-type is passed in Python's httplib2, but in Zinc is overriding
> by 'text/plain' it in #acceptEntityDescription: ? Any hints?

You were _very_ close. Indeed #contents: by default (without an explicit #contentReader set) will do something very generic. Setting the content-type as a header won't change the fact that the content-type of the entity wins, as you correctly said, in #acceptEntityDescription:

The solution is to explicitly make your own entity, like this:

| httpClient localApiKey text |
localApiKey := 'xxx'. " my API key "
text := 'Some huge announcements were made at Apple''s Worldwide
Developer''s Conference Monday, including the new mobile operating
system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.httpClient := ZnClient new
        systemPolicy;
        url: 'http://api.opencalais.com/tag/rs/enrich';
        headerAt: 'x-calais-licenseID' put: localApiKey;
        entity: (ZnEntity with: text type: 'text/raw');
        accept: 'application/json';
        contentReader: [ :entity | NeoJSONReader fromString: entity contents ];
        post.

Since content comes back as JSON, I parsed it already using NeoJSON (which you can easily load using the configuration browser). Using #systemPolicy will ensure that you get an error when the result is not 200 OK and application/json.

It worked for me: I made an account and got a result back.

HTH,

Sven

> Hernán
>
> [1]
> http://www.flagonwiththedragon.com/2011/06/08/dead-simple-python-calls-to-open-calais-api/


--
Sven Van Caekenberghe
Proudly supporting Pharo
http://pharo.org
http://association.pharo.org
http://consortium.pharo.org





Reply | Threaded
Open this post in threaded view
|

Re: Testing the OpenCalais web service

hernanmd
Hi Sven,
It worked perfectly now, it is really nice to have a library like Zinc.
Thank you!

Hernán

El 22/07/2013 5:37, Sven Van Caekenberghe escribió:

> Hi Hernán,
>
> It is great that you are using ZnClient and are providing feedback.
>
> On 21 Jul 2013, at 08:58, Hernán Morales Durand <[hidden email]> wrote:
>
>> I'm testing the OpenCalais web service. This is a web service which
>> needs an API key to be used (registering takes only 1 minute in
>> http://www.opencalais.com/APIkey). To check the service first I've used
>> a Python script, taken from [1]
>>
>> import httplib2
>> import json
>> LOCAL_API_KEY = '' # Aquire this by registering at the Calais site
>> CALAIS_TAG_API = 'http://api.opencalais.com/tag/rs/enrich'
>> # Some sample text from a news story to pass to Calais for analysis
>> test_body = """
>> Some huge announcements were made at Apple's Worldwide Developer's
>> Conference Monday, including the new mobile operating system iOS 5, PC
>> software OS X Lion, and the unveiling of the iCloud.
>> """
>> # header information need by Calais. For more info see
>> http://www.opencalais.com/documentation/calais-web-service-api/api-invocation/rest
>> headers = {
>>     'x-calais-licenseID': LOCAL_API_KEY,
>>     'content-type': 'text/raw',
>>     'accept': 'application/json',
>> }
>> # Create your http object
>> http = httplib2.Http()
>> # Make the http post request, passing the body and headers as needed.
>> response, content = http.request(CALAIS_TAG_API, 'POST',
>> headers=headers, body=test_body)
>> jcontent = json.loads(content) # Parse the json return into a python dict
>> print json.dumps(jcontent, indent=4) # Pretty print the resulting
>> dictionary returned.
>>
>> The Python script works fine for me. I have tried to translate the code
>> above, but my version in Pharo 2.0 using Zinc returns "I Read a
>> ZnResponse(415 Unsupported Media Type text/plain 365B)"
>>
>> | httpClient localApiKey |
>> localApiKey := ''. " my API key "
>> httpClient := ZnClient new
>> logToTranscript;
>> url: 'http://api.opencalais.com/tag/rs/enrich';
>> method: #POST;
>> headerAt: 'x-calais-licenseID' put: localApiKey;
>> headerAt: 'accept' put: 'application/json';
>> headerAt: 'content-Type' put: 'text/raw';
>> contents: 'Some huge announcements were made at Apple''s Worldwide
>> Developer''s Conference Monday, including the new mobile operating
>> system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.
>> httpClient execute.
>>
>> Additionally the request returns the following message:
>>
>> 'Document conversion error. Please make sure that the content-type
>> (passed through the paramsXML) matches this document contents.
>> [ErrorMessage:
>> com.clearforest.platform.system.CLFRuntimeException: There is no
>> converter for this type of URI
>> "file:/C:/CLFSW/v71/ct/bin/../../../v71/ct/var/dptemp/prvt/228295-app9/dp/papi/data/1374378595643-DF317E60-6634505.asc"
>> ]'
>>
>>  From what I could see, a difference is the 'text/raw'
>> content-type is passed in Python's httplib2, but in Zinc is overriding
>> by 'text/plain' it in #acceptEntityDescription: ? Any hints?
>
> You were _very_ close. Indeed #contents: by default (without an explicit #contentReader set) will do something very generic. Setting the content-type as a header won't change the fact that the content-type of the entity wins, as you correctly said, in #acceptEntityDescription:
>
> The solution is to explicitly make your own entity, like this:
>
> | httpClient localApiKey text |
> localApiKey := 'xxx'. " my API key "
> text := 'Some huge announcements were made at Apple''s Worldwide
> Developer''s Conference Monday, including the new mobile operating
> system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.httpClient := ZnClient new
> systemPolicy;
> url: 'http://api.opencalais.com/tag/rs/enrich';
> headerAt: 'x-calais-licenseID' put: localApiKey;
> entity: (ZnEntity with: text type: 'text/raw');
> accept: 'application/json';
> contentReader: [ :entity | NeoJSONReader fromString: entity contents ];
> post.
>
> Since content comes back as JSON, I parsed it already using NeoJSON (which you can easily load using the configuration browser). Using #systemPolicy will ensure that you get an error when the result is not 200 OK and application/json.
>
> It worked for me: I made an account and got a result back.
>
> HTH,
>
> Sven
>
>> Hernán
>>
>> [1]
>> http://www.flagonwiththedragon.com/2011/06/08/dead-simple-python-calls-to-open-calais-api/
>
>
> --
> Sven Van Caekenberghe
> Proudly supporting Pharo
> http://pharo.org
> http://association.pharo.org
> http://consortium.pharo.org
>
>
>
>
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Testing the OpenCalais web service

Stéphane Ducasse

On Jul 22, 2013, at 12:15 PM, Hernán Morales Durand <[hidden email]> wrote:

> Hi Sven,
> It worked perfectly now, it is really nice to have a library like Zinc.

+ 1
Infrastructure always pays off.

Stef

> Thank you!
>
> Hernán
>
> El 22/07/2013 5:37, Sven Van Caekenberghe escribió:
>> Hi Hernán,
>>
>> It is great that you are using ZnClient and are providing feedback.
>>
>> On 21 Jul 2013, at 08:58, Hernán Morales Durand <[hidden email]> wrote:
>>
>>> I'm testing the OpenCalais web service. This is a web service which
>>> needs an API key to be used (registering takes only 1 minute in
>>> http://www.opencalais.com/APIkey). To check the service first I've used
>>> a Python script, taken from [1]
>>>
>>> import httplib2
>>> import json
>>> LOCAL_API_KEY = '' # Aquire this by registering at the Calais site
>>> CALAIS_TAG_API = 'http://api.opencalais.com/tag/rs/enrich'
>>> # Some sample text from a news story to pass to Calais for analysis
>>> test_body = """
>>> Some huge announcements were made at Apple's Worldwide Developer's
>>> Conference Monday, including the new mobile operating system iOS 5, PC
>>> software OS X Lion, and the unveiling of the iCloud.
>>> """
>>> # header information need by Calais. For more info see
>>> http://www.opencalais.com/documentation/calais-web-service-api/api-invocation/rest
>>> headers = {
>>>    'x-calais-licenseID': LOCAL_API_KEY,
>>>    'content-type': 'text/raw',
>>>    'accept': 'application/json',
>>> }
>>> # Create your http object
>>> http = httplib2.Http()
>>> # Make the http post request, passing the body and headers as needed.
>>> response, content = http.request(CALAIS_TAG_API, 'POST',
>>> headers=headers, body=test_body)
>>> jcontent = json.loads(content) # Parse the json return into a python dict
>>> print json.dumps(jcontent, indent=4) # Pretty print the resulting
>>> dictionary returned.
>>>
>>> The Python script works fine for me. I have tried to translate the code
>>> above, but my version in Pharo 2.0 using Zinc returns "I Read a
>>> ZnResponse(415 Unsupported Media Type text/plain 365B)"
>>>
>>> | httpClient localApiKey |
>>> localApiKey := ''. " my API key "
>>> httpClient := ZnClient new
>>> logToTranscript;
>>> url: 'http://api.opencalais.com/tag/rs/enrich';
>>> method: #POST;
>>> headerAt: 'x-calais-licenseID' put: localApiKey;
>>> headerAt: 'accept' put: 'application/json';
>>> headerAt: 'content-Type' put: 'text/raw';
>>> contents: 'Some huge announcements were made at Apple''s Worldwide
>>> Developer''s Conference Monday, including the new mobile operating
>>> system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.
>>> httpClient execute.
>>>
>>> Additionally the request returns the following message:
>>>
>>> 'Document conversion error. Please make sure that the content-type
>>> (passed through the paramsXML) matches this document contents.
>>> [ErrorMessage:
>>> com.clearforest.platform.system.CLFRuntimeException: There is no
>>> converter for this type of URI
>>> "file:/C:/CLFSW/v71/ct/bin/../../../v71/ct/var/dptemp/prvt/228295-app9/dp/papi/data/1374378595643-DF317E60-6634505.asc"
>>> ]'
>>>
>>> From what I could see, a difference is the 'text/raw'
>>> content-type is passed in Python's httplib2, but in Zinc is overriding
>>> by 'text/plain' it in #acceptEntityDescription: ? Any hints?
>>
>> You were _very_ close. Indeed #contents: by default (without an explicit #contentReader set) will do something very generic. Setting the content-type as a header won't change the fact that the content-type of the entity wins, as you correctly said, in #acceptEntityDescription:
>>
>> The solution is to explicitly make your own entity, like this:
>>
>> | httpClient localApiKey text |
>> localApiKey := 'xxx'. " my API key "
>> text := 'Some huge announcements were made at Apple''s Worldwide
>> Developer''s Conference Monday, including the new mobile operating
>> system iOS 5, PC software OS X Lion, and the unveiling of the iCloud.'.httpClient := ZnClient new
>> systemPolicy;
>> url: 'http://api.opencalais.com/tag/rs/enrich';
>> headerAt: 'x-calais-licenseID' put: localApiKey;
>> entity: (ZnEntity with: text type: 'text/raw');
>> accept: 'application/json';
>> contentReader: [ :entity | NeoJSONReader fromString: entity contents ];
>> post.
>>
>> Since content comes back as JSON, I parsed it already using NeoJSON (which you can easily load using the configuration browser). Using #systemPolicy will ensure that you get an error when the result is not 200 OK and application/json.
>>
>> It worked for me: I made an account and got a result back.
>>
>> HTH,
>>
>> Sven
>>
>>> Hernán
>>>
>>> [1]
>>> http://www.flagonwiththedragon.com/2011/06/08/dead-simple-python-calls-to-open-calais-api/
>>
>>
>> --
>> Sven Van Caekenberghe
>> Proudly supporting Pharo
>> http://pharo.org
>> http://association.pharo.org
>> http://consortium.pharo.org
>>
>>
>>
>>
>>
>>
>
>