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

来源:互联网 发布:微博个性域名是什么 编辑:程序博客网 时间:2024/06/08 07:43
/** *使用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 OKSuccessful logininstance URL:https://ap4.salesforce.comaccess token/sessing ID:00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.baseUri:https://ap4.salesforce.com/services/apexrest/Merchandisehttps://ap4.salesforce.com/services/apexrest/Merchandise/insertMerchandiseJSON 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: 200New Merchandise id from response:"a026F00000w1byFQAQ"
View Code

2、查询一个List结果

oauthHeader1:Authorization: Bearer 00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.HTTP/1.1 200 OKSuccessful logininstance URL:https://ap4.salesforce.comaccess token/sessing ID:00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.baseUri:https://ap4.salesforce.com/services/apexrest/Merchandisehttps://ap4.salesforce.com/services/apexrest/Merchandise/getMerchandiseByName?name=testSalesforceRestfulApiresponse_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 OKSuccessful logininstance URL:https://ap4.salesforce.comaccess token/sessing ID:00D6F000000DauB!AQEAQFTLrj3cDuNoJuemXGm4HES9HvyHV9uJZk_TQVGAUd_oi5ZmxRWWYSsKB5Ibp8AOIALrR51laxO4jSnndv5.bsRk6G3.baseUri:https://ap4.salesforce.com/services/apexrest/MerchandiseDeleted the goods successfully.
View Code

 该JAVA项目中需要的jar包