一个蛋疼的小问题

实习期间,需要调用公司的一个接口服务,结果因为一个不起眼的问题弄了半下午。代码采用的是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);

猜你喜欢

转载自blog.csdn.net/secure2/article/details/80931857