package com.erdaoya.springcloud.comx.source.sourcebase; import com.alibaba.fastjson.JSONObject; import com.erdaoya.springcloud.comx.context.Context; import com.erdaoya.springcloud.comx.source.SourceBizException; import com.erdaoya.springcloud.comx.source.SourceException; import com.erdaoya.springcloud.comx.utils.config.ConfigException; import com.erdaoya.springcloud.comx.utils.config.Config; import com.erdaoya.springcloud.comx.utils.rest.RequestMessage; import org.springframework.http.*; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import java.net.URI; import java.util.HashMap; import java.util.Map; /** * Created by xue on 2/6/17. * * TODO 应当是一个插件,暂时这么实现 * 不配置不应当影响正常服务 * Spring 在启动时加载? * 因为SERVER_ID 不是一个域名,使用通用的方式解析会失败,故自己拼装 */ public class SpringCloudSourceBase extends AbstractRequestBasedSourceBase{ static final String FIELD_URL_PREFIX = "urlPrefix"; public String getUrlPrefix(Context context) throws ConfigException { return conf.rstr(FIELD_URL_PREFIX); } public SpringCloudSourceBase(Config conf){super(conf);} // return restTemplate.getForEntity("http://config-server/user-service-dev.json", Object.class).getBody(); // 这个时候 request headers 应当已经被处理好保留字段,只需要封装入client //TODO timeout 应当于外部已经被设定 // rest template 当传递 accept 为 */* 时,返回不能正确解析 public Object doRequest(RequestMessage requestMessage, Context context) throws SourceException { String method = requestMessage.getMethod(); HashMap<String, String> requestheaders = requestMessage.getHeaderParameters(); Map<String, Object> data = requestMessage.getData(); HttpHeaders headers = new HttpHeaders(); requestheaders.remove("Accept"); headers.setAll(requestheaders); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = (null == data)? new HttpEntity<String>(headers): new HttpEntity<String>(new JSONObject(data).toString(), headers); RestTemplate restTemplate = context.getRestTemplate(); URI aURI = requestMessage.getUrl().getaURI(); try { ResponseEntity<Object> responseEntity = restTemplate.exchange(aURI, HttpMethod.resolve(method.toUpperCase()), entity, Object.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { return responseEntity.getBody(); } else { throw new SourceBizException(responseEntity.getBody().toString(), Integer.parseInt(responseEntity.getStatusCode().toString())); } } catch (HttpClientErrorException ex) { throw new SourceBizException(ex.getStatusText(), Integer.parseInt(ex.getStatusCode().toString())); } } }