JSON-PRC запрос из Java приложения к биллингу
Материал из BiTel WiKi
Версия от 07:37, 21 ноября 2014; Администратор (Обсуждение | вклад)
Пример работы взят из исходного кода системы BGCRM.
Для работы используется библиотека JSON Jackson.
Загрузка библиотеки производится из Maven репозитария: [1]
Понадобятся библиотеки: jackson-core.jar, ackson-databind.jar, jackson-annotations.jar. Также можно получить из из дистрибутива биллинга.
Класс-запрос:
public class RequestJsonRpc { private final String module; private final int moduleId; private final String service; private final String method; private final Map<String, Object> params = new HashMap<String, Object>(); public RequestJsonRpc( String module, String service, String method ) { this( module, 0, service, method ); } public RequestJsonRpc( String module, int moduleId, String service, String method ) { this.module = module; this.moduleId = moduleId; this.service = service; this.method = method; } public String getUrl() { StringBuilder result = new StringBuilder( module ); if( moduleId > 0 ) { result.append( "/" ); result.append( moduleId ); } result.append( "/" ); result.append( service ); return result.toString(); } public String getMethod() { return method; } public void setParam( String name, Object value ) { params.put( name, value ); } public void setParamContractId( int value ) { params.put( "contractId", value ); } public Map<String, Object> getParams() { return params; } }
Метод отправки запроса:
private JsonNode postData( RequestJsonRpc request, UserAccount user ) throws Exception { JsonNode result = null; ObjectNode rootObject = m.createObjectNode(); rootObject.put( "method", request.getMethod() ); ObjectNode userObject = rootObject.putObject( "user" ); userObject.put( "user", user.getLogin() ); userObject.put( "pswd", user.getPassword() ); ObjectNode paramsObject = rootObject.putObject( "params" ); for( Map.Entry<String, Object> me : request.getParams().entrySet() ) { paramsObject.putPOJO( me.getKey(), me.getValue() ); } URL fullUrl = new URL( url.toString() + "/json/" + request.getUrl() ); HttpURLConnection con = (HttpURLConnection)fullUrl.openConnection(); con.setRequestMethod( "POST" ); con.setDoOutput( true ); con.setDoInput( true ); con.setRequestProperty( "Content-type", "application/json; charset=UTF-8" ); String serialized = m.writer().writeValueAsString( rootObject ); if( log.isDebugEnabled() ) { log.debug( this.hashCode() + " " + fullUrl ); log.debug( this.hashCode() + " " + (serialized.length() < LOGGING_REQUEST_TRIM_LENGTH ? serialized : serialized.substring( 0, LOGGING_REQUEST_TRIM_LENGTH )) ); } new PrintStream( con.getOutputStream(), true, requestEncoding ).print( serialized ); if( con.getResponseCode() == HttpURLConnection.HTTP_OK ) { String response = new String( IOUtils.toByteArray( con.getInputStream() ), requestEncoding ); result = m.readTree( response ); if( log.isDebugEnabled() ) { final int len = response.length(); log.debug( this.hashCode() + " [ length = " + len + " ] xml = " + ( len > LOGGING_RESPONSE_TRIM_LENGTH ? response.substring( 0, LOGGING_RESPONSE_TRIM_LENGTH ) + "..." : response ) ); } con.disconnect(); } return result; }
Метод проверки статуса ответа:
private void checkDocumentStatus( JsonNode rootNode, User user ) throws BGException { String status = rootNode.path( "status" ).textValue(); if( !"ok".equals( status ) ) { throw new BGMessageException( "На запрос пользователя " + user.getTitle() + " биллинг вернул ошибку: " + rootNode.path( "message" ).textValue() ); } }
Библиотека Jackson позволяет сериализовать в JSON представление любой Java Bean объект, на основании get методов.
И загружать извлекать данные из JSON в Java объекты. Некоторые примеры работы: