无法从HttpClient调用接收数据

时间:2015-04-17 11:51:12

标签: java rest resources

我正在尝试通过HttpClient向资源发送POST请求,但似乎没有数据可供使用..

我在调用传递给该资源之前有一个过滤器来验证签名并对其进行验证,但之后没有任何反应..资源端没有收到任何触发相应异常的数据 这是我提出请求的代码

CloseableHttpResponse response = null;
StringBuilder result = new StringBuilder();
try {
CloseableHttpClient client=HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
HttpPost request = new HttpPost(API_BASE_URL + "/generateToken");
//Set Headers
request.setHeader("Accept", "application/json");
request.setHeader("Content-Type", "application/x-www-form-urlencoded");
request.addHeader("Signature",URLEncoder.encode(generateSignature(),"UTF-8"));
request.addHeader("Expires", String.valueOf(timestamp));
request.addHeader("AccessKey", URLEncoder.encode(accessKey, "UTF-8"));

//Add Paramets
request.setEntity(new UrlEncodedFormEntity(parameters));

//Sends Request
response = client.execute(request);

//Read From Response
BufferedReader reader;
InputStream inputStream = response.getEntity().getContent();
reader = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while ((inputLine = reader.readLine()) != null) {
result.append(inputLine);
}
EntityUtils.consume(response.getEntity());

我发送loginpass作为列表<NameVaulePair>参数

我的资源代码

@POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response getToken(@FormParam("login") String slashtagOrEmail,
            @FormParam("pass") String password) {
        String token = null;
        try {
            token = publisherService.authenticate(slashtagOrEmail, password);
            return Response.ok().entity(token).build();
        } catch (RemoteException | EmailNotFoundException | UsernameNotFoundException | UnknownLoginException | IncorrectPasswordException | AccountNotConfirmedException ex) {
            return Response.status(Response.Status.UNAUTHORIZED).entity(ex.toString()).build();
        }

    }

在我提出请求后,我得到UsernameNotFoundException,这基本上是空slashtagOrEmail变量

publisherService.authenticate()函数的JUnit测试给出了正确的结果,我没看到我在哪里犯了错误。

PS:这是我关于SO的第一个问题,请帮助我更好地构建问题,再次感谢

1 个答案:

答案 0 :(得分:0)

根据您的代码判断,您使用的是ssl验证程序,而您可能正在连接到http://example.com而不是https://example.com

在这种情况下,它的 302 空响应。因为服务器将端口80(默认HTTP端口)请求重定向到端口443(默认SSL端口)

检查响应代码是否 302 。 HttpClient不会自动重定向到页面。 https://stackoverflow.com/a/5170468/1097600

System.out.println("Response Code : " 
            + response.getStatusLine().getStatusCode());

解决方案:将网址更改为https://example.com