プログラマ38の日記

主にプログラムメモです。

Salesforce: java用WSC(ver44)を使ってRest APIを利用する

HttpURLConnectionを用意すればHttpヘッダやエンドポイントを指定すれば利用できますが、WSCに用意されている仕組みでRest APIを利用できます。

 

 

サンプルコード

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.zip.GZIPInputStream;

import org.codehaus.jackson.map.ObjectMapper;

import com.sforce.soap.partner.LoginResult;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.ws.ConnectorConfig;
import com.sforce.ws.transport.JdkHttpTransport;

public class RestSample {

	public static void main(String[] args) throws Exception{
		
		//接続用情報
		String partnerEndpoint = "https://login.salesforce.com/services/Soap/u/44.0";
		String username = "sampleuser@sample.user";
		String password = "samplepassword";
		
		ConnectorConfig pConfig = new ConnectorConfig();
		pConfig.setServiceEndpoint(partnerEndpoint);
		pConfig.setManualLogin(true);		
		PartnerConnection pCon = new PartnerConnection(pConfig);
		
		//ログイン
		LoginResult lr = pCon.login(username, password);
		
		String serverUrl = lr.getServerUrl();
		String sessionId = lr.getSessionId();
		
		String url = serverUrl.substring(0, serverUrl.indexOf("/services"));
		url = url + "/services/data";
		
		HashMap<String, String> httpHeaders = new HashMap<String, String>();
		httpHeaders.put("Accept-Charset", "UTF-8");
		httpHeaders.put("Content-Type", "application/json");
		httpHeaders.put("Authorization", "Bearer " + sessionId);	
		httpHeaders.put("Accept", "application/json");
		
		//Rest用のコネクションを作成
		HttpURLConnection resthttp = JdkHttpTransport.createConnection(
		                              pConfig, new URL(url), httpHeaders, true);
		resthttp.setRequestMethod("GET");
		resthttp.setInstanceFollowRedirects(true);
		
		BufferedReader br = new BufferedReader(new InputStreamReader(
				new GZIPInputStream(resthttp.getInputStream()),"utf8"));
		
		StringWriter writer = new StringWriter();
		while(true) {
			String line = br.readLine();
			if(line == null) {
				break;
			}
			writer.append(line);
		}
		
		//返却されたJson文字列
		String jsonStr = writer.toString();
		
		//Jsonのパース
		ObjectMapper mapper = new ObjectMapper();
		Object o = mapper.readValue(jsonStr,Object.class);	
	}
}

用意されている関数

サンプルコードの青文字の太字箇所で、JdkHttpTransport.createConnection を使うことでWSCが少し便利にしてくれたHttpURLConnection を利用することができます。

便利になるのが、ConnectorConfigでhttpプロキシを指定していた場合は、JdkHttpTransport.createConnectionで作成したHttpURLConnection はそのままConnectorConfigのhttpプロキシを使用した通信となります。
※HttpURLConnectionをopenする際に別途httpプロキシを指定しなくても良くなります。

そして、JdkHttpTransport.createConnectionの、最後の引数に true を指定することでgzip圧縮した通信設定をしてくれます。(これもhttpヘッダで自分で指定すればいいだけですが・・)

とはいえ、多少なりともコードは少なります。

最後に

WSCも以前のバージョンでは、PartnerConnectionやMetadataConnectionのように、RestConnectionがあったのですが、いつの間にかなくなっていました。

そして、以前のバージョンではJson用ライブラリがGsonだったのですが、いつの間にかJacksonに変更されています。

WSCで利用するバージョンによって中身が違うので気を付けないといけないなーと思いました。