实习期间,需要调用公司的一个接口服务,结果因为一个不起眼的问题弄了半下午。代码采用的是HttpClient的方式实现。
HTTPClient
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议
HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。
代码如下:
ublic class GetShortUrlService extends AbstractGateWayService<GetShortUrlRequestType,GetShortUrlResponseType> {
private static final int TIIME_OUT=6000;
@Override
protected boolean validator() {
return true;
}
@Override
protected void handler() throws Exception {
GetShortUrlResponseDataObject dataObject=new GetShortUrlResponseDataObject();
String longUrl=request.getLongUrl();
System.out.println(longUrl);
String shortUrl=createShortLinkUrl(longUrl);
System.out.println(shortUrl);
dataObject.setShortUrl(shortUrl);
response.setData(dataObject);
}
public static String createShortLinkUrl(String sharedLink){
Map<String,String> getShortUrlConfig=GetShortUrlConfig.getConfig();
if(getShortUrlConfig==null){
return StringUtils.EMPTY;
}
//通过内部Util调用的服务来获取配置文件配置的属性
String serviceUrl=getShortUrlConfig.get("UrlService");
//String serviceUrl="http://ws.urlservice.fx.fws.qa.nt.ctripcorp.com/urlService-api/";
final HttpPost httpPost=new HttpPost(serviceUrl+"api/Shortenter/Post");
RequestConfig requestConfig=RequestConfig.custom().setConnectTimeout(TIIME_OUT).setSocketTimeout(TIIME_OUT).build();
httpPost.setConfig(requestConfig);
//重点在这里
StringEntity stringEntity= new StringEntity("\""+sharedLink+"\"", Consts.UTF_8);
stringEntity.setContentEncoding("UTF-8");
httpPost.setEntity(stringEntity);
/**
httpPost.addHeader("Content-Type","application/json");
httpPost.setConfig(requestConfig);
httpPost.setEntity(new StringEntity("\"" + sharedLink + "\"", Consts.UTF_8));
*/
String response=doPost(httpPost);
if(ObjectUtils.isNullOrEmpty(response)){
return StringUtils.EMPTY;
}
String content = org.apache.commons.lang3.StringUtils.strip(response, "\"");
return getShortUrlConfig.get("") + content;
//return "https://t.ctrip.cn/"+content;
}
public static String doPost(final HttpRequestBase httpRequestBase){
try {
final CloseableHttpClient httpClient= HttpClients.createDefault();
final CloseableHttpResponse httpResponse=httpClient.execute(httpRequestBase);
System.out.println(httpResponse.getStatusLine().getStatusCode());
if(httpResponse.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
return EntityUtils.toString(httpResponse.getEntity(),Consts.UTF_8);
}
} catch (IOException e) {
e.printStackTrace();
}
return StringUtils.EMPTY;
}
}
在Postman测试的时候,Headers里面设置Content-Type为application/json,body里填写一个字符串(示例:
“http://blog.csdn.net/stronglyh/article/details/49488465“),该接口可以正常提供长串转短串服务。但是因为那两个双引号,在代码里面调用的时候,需要在代码里面添加一个转义的双引号。。。。。否则就无法正常访问(返回500错误)。
StringEntity stringEntity= new StringEntity(“\”“+sharedLink+”\”“, Consts.UTF_8);