Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MercadoLibre API Adapter #212

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Expand Up @@ -9,7 +9,9 @@


.idea .idea
scribe.iml scribe.iml
scribe.ipr
scribe.iws


# Binaries # Binaries


target target
22 changes: 22 additions & 0 deletions src/main/java/org/scribe/builder/api/DefaultApi20.java
Expand Up @@ -42,6 +42,28 @@ public Verb getAccessTokenVerb()
{ {
return Verb.GET; return Verb.GET;
} }

/**
* Returns accept media type which can be used to specify certain media type which is acceptable for the response.
* Optional parameter.
*
* @return accept media type
*/
public String getAcceptMediaType()
{
return null;
}


/**
* Returns true if accept media type is set
*
* @return true if accept media type is set
*/
public boolean hasAcceptHeader() {
return getAcceptMediaType() != null;
}



/** /**
* Returns the URL that receives the access token requests. * Returns the URL that receives the access token requests.
Expand Down
49 changes: 49 additions & 0 deletions src/main/java/org/scribe/builder/api/MercadoLibreApi.java
@@ -0,0 +1,49 @@
package org.scribe.builder.api;

import org.scribe.extractors.AccessTokenExtractor;
import org.scribe.extractors.JsonTokenExtractor;
import org.scribe.model.OAuthConfig;
import org.scribe.model.Verb;
import org.scribe.utils.Preconditions;

import static org.scribe.utils.URLUtils.formURLEncode;

/**
* @author: Pablo Molnar
*/
public class MercadoLibreApi extends DefaultApi20
{
private static final String AUTHORIZE_URL = "https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=%s&redirect_uri=%s";
private static final String ACCESS_TOKEN_URL = "https://api.mercadolibre.com/oauth/token?grant_type=authorization_code";
private static final String ACCEPT_MEDIA_TYPE = "application/json";


@Override
public String getAccessTokenEndpoint()
{
return ACCESS_TOKEN_URL;
}

@Override
public String getAuthorizationUrl(OAuthConfig config)
{
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. MercadoLibre does not support OOB");
return String.format(AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()));
}

@Override
public Verb getAccessTokenVerb() {
return Verb.POST;
}

@Override
public AccessTokenExtractor getAccessTokenExtractor()
{
return new JsonTokenExtractor();
}

@Override
public String getAcceptMediaType() {
return ACCEPT_MEDIA_TYPE;
}
}
3 changes: 3 additions & 0 deletions src/main/java/org/scribe/oauth/OAuth20ServiceImpl.java
Expand Up @@ -33,6 +33,8 @@ public Token getAccessToken(Token requestToken, Verifier verifier)
request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue()); request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue());
request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback()); request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
if(config.hasScope()) request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope()); if(config.hasScope()) request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope());
if(api.hasAcceptHeader()) request.addHeader("Accept", api.getAcceptMediaType());

Response response = request.send(); Response response = request.send();
return api.getAccessTokenExtractor().extract(response.getBody()); return api.getAccessTokenExtractor().extract(response.getBody());
} }
Expand All @@ -58,6 +60,7 @@ public String getVersion()
*/ */
public void signRequest(Token accessToken, OAuthRequest request) public void signRequest(Token accessToken, OAuthRequest request)
{ {
if(api.hasAcceptHeader()) request.addHeader("Accept", api.getAcceptMediaType());
request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken()); request.addQuerystringParameter(OAuthConstants.ACCESS_TOKEN, accessToken.getToken());
} }


Expand Down
67 changes: 67 additions & 0 deletions src/test/java/org/scribe/examples/MercadoLibreExample.java
@@ -0,0 +1,67 @@
package org.scribe.examples;

import org.scribe.builder.ServiceBuilder;
import org.scribe.builder.api.MercadoLibreApi;
import org.scribe.model.*;
import org.scribe.oauth.OAuthService;

import java.util.Scanner;

/**
* @author: Pablo Molnar
*/
public class MercadoLibreExample
{
private static final String NETWORK_NAME = "MercadoLibre";
private static final String PROTECTED_RESOURCE_URL = "https://api.mercadolibre.com/users/me";
private static final Token EMPTY_TOKEN = null;

public static void main(String[] args)
{
// Replace these with your own api key and secret
String apiKey = "2731";
String apiSecret = "1TfBiXqXbRGKbHWcaknf5CpBXrLczTaJ";
OAuthService service = new ServiceBuilder()
.provider(MercadoLibreApi.class)
.apiKey(apiKey)
.apiSecret(apiSecret)
.callback("http://www.example.com/oauth_callback/")
.build();
Scanner in = new Scanner(System.in);

System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ===");
System.out.println();

// Obtain the Authorization URL
System.out.println("Fetching the Authorization URL...");
String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
System.out.println("Got the Authorization URL!");
System.out.println("Now go and authorize Scribe here:");
System.out.println(authorizationUrl);
System.out.println("And paste the authorization code here");
System.out.print(">>");
Verifier verifier = new Verifier(in.nextLine());
System.out.println();

// Trade the Request Token and Verfier for the Access Token
System.out.println("Trading the Request Token for an Access Token...");
Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier);
System.out.println("Got the Access Token!");
System.out.println("(if your curious it looks like this: " + accessToken + " )");
System.out.println();

// Now let's go and ask for a protected resource!
System.out.println("Now we're going to access a protected resource...");
OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);
service.signRequest(accessToken, request);
Response response = request.send();
System.out.println("Got it! Lets see what we found...");
System.out.println();
System.out.println(response.getCode());
System.out.println(response.getBody());

System.out.println();
System.out.println("Thats it man! Go and build something awesome with Scribe! :)");

}
}