73、salesforce通过JAVA来Call在salesforce中已经写好的Restful处理接口

/**
 *使用salesforce通过REST方式作为webservice,需要以下几点
 *1、类和方法需要global,方法需要静态
 *2、类需要通过RestResource(UrlMapping='/page/*')注解声明
 *3、@HttpGet和@HttpDelete不能有形参,可以通过URL?param或者URL/param方式传过来参数
**/
@RestResource(UrlMapping='/Merchandise/*')
global class MerchandiseRESTController {
    global static final Integer PAGE_SIZE = 20;
    public static string merchandiseName {get;set;}
    public static string merchandiseId {get;set;}
    
    @HttpGet
    global static List<Merchandise__c> getMerchandiseByName(){
        RestRequest request = RestContext.request;
        //grab the merchandise Id from the end of the URL
        String currentPage = request.params.get('currentPage')!=null?request.params.get('currentPage'):'0';
        Integer offsetNumber = Integer.valueOf(currentPage) * PAGE_SIZE;
        merchandiseName = request.params.get('name');
        String fetchSql;
        if(merchandiseName!=null){
            fetchSql = 'SELECT Quantity__c,Price__c,Name from Merchandise__c where Name=:merchandiseName';
        }else{
            fetchSql = 'SELECT Quantity__c,Price__c,Name from Merchandise__c limit:PAGE_SIZE offset:offsetNumber ';
        }
        List<Merchandise__c> merchandiseList = Database.query(fetchSql);
        return merchandiseList;
    }
    
    @HttpPost
    global static Id insertMerchandise(String name,String price,String quantity){
        System.debug('----------merchandise name---------'+name);
        Merchandise__c merchandise = new Merchandise__c();
        if(price!=null && price.isNumeric()){
            merchandise.Price__c = Decimal.valueOf(price);
        }
        if(quantity!=null && quantity.isNumeric()){
            merchandise.Quantity__c =Decimal.valueOf(quantity);
        }
        merchandise.Name = name;
        insert merchandise;
        return merchandise.Id;
    }
    
    @HttpDelete
    global static void deleteMerchandise(){
        RestRequest request = RestContext.request;
        merchandiseName = request.requestURI.substring(request.requestURI.lastIndexOf('/')+1);
        String querySql = 'select Id from Merchandise__c where Name =:merchandiseName';
        List<Merchandise__c> merchandiseList = Database.query(querySql);
        if(merchandiseList!=null){
            delete merchandiseList;
        }
    }
    
    @HttpPut
    global static Id upsertMerchandise(String name,String price,String quantity){
        Merchandise__c merchandise = new Merchandise__c();
        merchandise.Name = name;
         if(price!=null && price.isNumeric()){
            merchandise.Price__c = Decimal.valueOf(price);
        }
        if(quantity!=null && quantity.isNumeric()){
            merchandise.Quantity__c =Decimal.valueOf(quantity);
        }
        upsert merchandise;
        return merchandise.Id;
        
    }
    
    /**@HttpPatch
    global static Id updateMerchandise(){
        RestRequest request = RestContext.request;
        merchandiseName = request.requestURI.substring(
               request.requestURI.lastIndexOf('/')+1);
        String querySql = 'select Id from Merchandise__c where Name =:merchandiseName';
        List<Merchandise__c> merchandiseList = Database.query(querySql);
        // Deserialize the JSON string into name-value pairs
        Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(request.requestbody.tostring());
        // Iterate through each parameter field and value
        
    }**/
    
    
    
    
}
View Code

上边是salesforce中的接口实现,通过restful方式来处理http请求

 

下边则是JAVA中调用上边salesforce中已经处理好的restful的http接口

package com.test.salesforce.restful;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.DefaultedHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

public class TestSalesforceRestful {
    static final String USERNAME = "weizhen.zhao@pactera.com";
    static final String PASSWORD = "zwz87865918vYoQKmkHZ3CHvlWxktmXybWi";
    static final String LOGINURL = "https://login.salesforce.com";
    static final String GRANTSERVIVE = "/services/oauth2/token?grant_type=password";
    static final String CLIENTID = "3MVG9YDQS5WtC11rl9X0l.9UJjmHTftDEUlhQz8SsxqKUk5iRxSgSp2aeKxM1NHJBkzp.VJqIT56XXPnLk5oi";
    static final String CLIENTSECRET = "9102086465628528777";
    private static String REST_ENDPOINT = "/services/apexrest";
    private static String baseUri;
    private static Header oauthHeader;
    private static Header prettyPrintHeader = new BasicHeader("X-PrettyPrint", "1");

    public static void main(String[] args) {
        // 测试restful 创建一个merchandise
        // createMerchandise("testSalesforceRestfulApi", "2000", "20001");

        // 测试restful 查询一个List结果集
        /*List<Merchandise> list = getMerchandiseByName("testSalesforceRestfulApi");
        for (Merchandise item : list) {
            System.out.print(item.getName() + "\t");
            System.out.print(item.getPrice() + "\t");
            System.out.println(item.getQuantity() + "\t");
        }*/
        
        //删除一个Merchandise
        //deleteMerchandise("testSalesforceRestfulApi");
    }

    public static void deleteMerchandise(String name) {
        if (isAccessable()) {
            HttpClient client = HttpClientBuilder.create().build();
            String url = baseUri + "/deleteMerchandise/" + name;
            HttpDelete delete = new HttpDelete(url);
            delete.addHeader(oauthHeader);
            delete.addHeader(prettyPrintHeader);
            HttpResponse response = null;
            try {
                response = client.execute(delete);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == HttpStatus.SC_OK) {
                    System.out.println("Deleted the goods successfully.");
                } else {
                    System.out.println("goods delete NOT successful. Status code is " + statusCode);
                }
                delete.releaseConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * distinguish whether can access sfdc or not
     * 
     * @return
     */
    private static boolean isAccessable() {
        HttpClient httpClient = HttpClientBuilder.create().build();
        // Assemble the login request URL
        String loginURL = LOGINURL + GRANTSERVIVE + "&client_id=" + CLIENTID + "&client_secret=" + CLIENTSECRET
                + "&username=" + USERNAME + "&password=" + PASSWORD;

        // Login requests must be POSTs
        HttpPost httpPost = new HttpPost(loginURL);
        HttpResponse response = null;
        try {
            response = httpClient.execute(httpPost);
        } catch (ClientProtocolException cpException) {
            cpException.printStackTrace();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
        // verify response is HTTP OK
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            System.out.println("Error authenticating to Force.com:" + statusCode);
            return false;
        }
        String getResult = null;
        try {
            getResult = EntityUtils.toString(response.getEntity());
        } catch (ParseException | IOException e) {
            e.printStackTrace();
        }
        JSONObject jsonObject = null;
        String loginAccessToken = null;
        String loginInstanceUri = null;
        try {
            jsonObject = (JSONObject) new JSONTokener(getResult).nextValue();
            loginAccessToken = jsonObject.getString("access_token");
            loginInstanceUri = jsonObject.getString("instance_url");
        } catch (JSONException jsonException) {
            jsonException.printStackTrace();
        }
        baseUri = loginInstanceUri + REST_ENDPOINT + "/Merchandise";
        oauthHeader = new BasicHeader("Authorization", "Bearer " + loginAccessToken);
        System.out.println("oauthHeader1:" + oauthHeader);
        System.out.println(response.getStatusLine());
        System.out.println("Successful login");
        System.out.println("instance URL:" + loginInstanceUri);
        System.out.println("access token/sessing ID:" + loginAccessToken);
        System.out.println("baseUri:" + baseUri);
        return true;
    }

    /**
     * httpGet請求RESTful
     * 
     * @param name
     * @return
     */
    public static List<Merchandise> getMerchandiseByName(String name) {
        if (isAccessable()) {
            String uri = baseUri + "/getMerchandiseByName?name=" + name;
            System.out.println(uri);
            HttpClient client = HttpClientBuilder.create().build();
            HttpGet get = new HttpGet(uri);
            get.setHeader(oauthHeader);
            get.setHeader(prettyPrintHeader);

            try {
                HttpResponse response = client.execute(get);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == HttpStatus.SC_OK) {
                    List<Merchandise> merchandiseList = new ArrayList<Merchandise>();
                    String response_string = EntityUtils.toString(response.getEntity());
                    System.out.println("response_string:" + response_string);
                    JSONArray jsonArray = new JSONArray(response_string);
                    JSONObject jsonObject = null;
                    for (int i = 0; i < jsonArray.length(); i++) {
                        jsonObject = jsonArray.getJSONObject(i);
                        Merchandise item = new Merchandise();
                        if (jsonObject != null) {
                            item.setName(jsonObject.getString("Name"));
                            item.setPrice(jsonObject.getDouble("Price__c"));
                            item.setQuantity(jsonObject.getInt("Quantity__c"));
                        }
                        merchandiseList.add(item);
                    }
                    get.releaseConnection();
                    return merchandiseList;
                } else {
                    get.releaseConnection();
                    return null;
                }
            } catch (JSONException e) {
                System.out.println("Issue creating JSON or processing results");
                e.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (NullPointerException npe) {
                npe.printStackTrace();
            }
        }
        return null;

    }

    /**
     * httpPost請求 call restful api to create a merchandise return merchandise Id
     * 
     * @param name
     * @param price
     * @param quantity
     */
    public static void createMerchandise(String name, String price, String quantity) {
        try {
            if (isAccessable()) {
                String uri = baseUri + "/insertMerchandise";
                System.out.println(uri);
                JSONObject merchandise = new JSONObject();
                merchandise.put("name", name);
                merchandise.put("price", price);
                merchandise.put("quantity", quantity);
                System.out.println("JSON for merchandises record to be insert:\n" + merchandise.toString());
                // Construct the objects needed for the request
                HttpClient httpClient = HttpClientBuilder.create().build();
                ;
                System.out.println("oauthHeader" + oauthHeader);
                HttpPost httpPost = new HttpPost(uri);
                httpPost.addHeader(oauthHeader);
                httpPost.addHeader(prettyPrintHeader);
                httpPost.addHeader("encoding", "UTF-8");
                // The message we are going to post
                StringEntity body = new StringEntity(merchandise.toString(1));
                System.out.println(merchandise.toString(1));
                body.setContentType("application/json");
                httpPost.setEntity(body);

                // Make the request
                HttpResponse response = httpClient.execute(httpPost);
                System.out.println("response: " + response.toString());
                // Process the results
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("status code: " + statusCode);
                if (statusCode == HttpStatus.SC_OK) {
                    String response_String = EntityUtils.toString(response.getEntity());
                    if (response_String != null) {
                        System.out.println("New Merchandise id from response:" + response_String);
                    }
                } else {
                    System.out.println("Insertion unsuccessful.Status code returned is" + statusCode);
                }
                httpPost.releaseConnection();
            }
        } catch (JSONException e) {
            System.out.println("Issue creating JSON or processing results");
            e.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        }

    }

}
View Code

 

 

下边是在JAVA的main方法中的测试结果

public static void main(String[] args) {
        // 测试restful 创建一个merchandise
        // createMerchandise("testSalesforceRestfulApi", "2000", "20001");

        // 测试restful 查询一个List结果集
        /*List<Merchandise> list = getMerchandiseByName("testSalesforceRestfulApi");
        for (Merchandise item : list) {
            System.out.print(item.getName() + "\t");
            System.out.print(item.getPrice() + "\t");
            System.out.println(item.getQuantity() + "\t");
        }*/
        
        //删除一个Merchandise
        //deleteMerchandise("testSalesforceRestfulApi");
    }

1、创建

oauthHeader1:Authorization: Bearer 00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
HTTP/1.1 200 OK
Successful login
instance URL:https://ap4.salesforce.com
access token/sessing ID:00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
baseUri:https://ap4.salesforce.com/services/apexrest/Merchandise
https://ap4.salesforce.com/services/apexrest/Merchandise/insertMerchandise
JSON for merchandises record to be insert:
{"quantity":"20001","price":"2000","name":"testSalesforceRestfulApi"}
oauthHeaderAuthorization: Bearer 00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
{
 "quantity": "20001",
 "price": "2000",
 "name": "testSalesforceRestfulApi"
}
response: HttpResponseProxy{HTTP/1.1 200 OK [Date: Sat, 18 Mar 2017 10:46:28 GMT, X-Content-Type-Options: nosniff, X-XSS-Protection: 1; mode=block, Content-Security-Policy: reflected-xss block;report-uri /_/ContentDomainCSPNoAuth?type=xss, Content-Security-Policy: referrer origin-when-cross-origin, Set-Cookie: BrowserId=zDGh-qaEQOK5dJ9CGjk37A;Path=/;Domain=.salesforce.com;Expires=Wed, 17-May-2017 10:46:28 GMT, Expires: Thu, 01 Jan 1970 00:00:00 GMT, Content-Type: application/json;charset=UTF-8, Vary: Accept-Encoding, Transfer-Encoding: chunked] org.apache.http.client.entity.DecompressingEntity@77e9807f}
status code: 200
New Merchandise id from response:"a026F00000w1byFQAQ"
View Code

2、查询一个List结果

oauthHeader1:Authorization: Bearer 00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
HTTP/1.1 200 OK
Successful login
instance URL:https://ap4.salesforce.com
access token/sessing ID:00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
baseUri:https://ap4.salesforce.com/services/apexrest/Merchandise
https://ap4.salesforce.com/services/apexrest/Merchandise/getMerchandiseByName?name=testSalesforceRestfulApi
response_string:[ {
  "attributes" : {
    "type" : "Merchandise__c",
    "url" : "/services/data/v39.0/sobjects/Merchandise__c/a026F00000w1byFQAQ"
  },
  "Quantity__c" : 20001,
  "Price__c" : 2000.00,
  "Name" : "testSalesforceRestfulApi",
  "Id" : "a026F00000w1byFQAQ"
} ]
testSalesforceRestfulApi    2000.0    20001    
View Code

3、删除一个Merchandise通过HttpDelete

oauthHeader1:Authorization: Bearer 00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
HTTP/1.1 200 OK
Successful login
instance URL:https://ap4.salesforce.com
access token/sessing ID:00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.
baseUri:https://ap4.salesforce.com/services/apexrest/Merchandise
Deleted the goods successfully.
View Code

 该JAVA项目中需要的jar包

 

posted @ 2017-03-18 18:49  香港胖仔  阅读(1333)  评论(0编辑  收藏  举报