为什么Jersey GET要求客户返回404?

时间:2017-02-02 20:58:21

标签: java web-services rest jax-rs jersey-2.0

我在Glassfish服务器上部署了一个简单的WAR应用程序,它具有以下资源:

@Path("/oauth")
public class Oauth {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getValidateCallSignature(@QueryParam("oauth_consumer_key") String consumerKey,
                                            @QueryParam("oauth_nonce") String nonce, 
                                            @QueryParam("oauth_signature_method") String signatureMethod,
                                            @QueryParam("oauth_timestamp") long timeStamp, 
                                            @QueryParam("oauth_version") long version, 
                                            @QueryParam("oauth_signature") String signature) {

        System.out.println("### oauth/ called");

        return consumerKey + " --" + nonce + " --" + signatureMethod + " --" + timeStamp + " --" + version + " --" + signature;
    }
}

此应用位于localhost:8080/EloquaTest/api/

使用javax.ws.rs.core.Application而不是部署描述符启动RESTful服务。

@ApplicationPath("/api")
public class AppStarter extends Application {}

运行应用程序后,我在浏览器中输入以下URL进行了测试:http://localhost:8080/EloquaTest/api/oauth?oauth_nonce=5564316845&oauth_signature=HMAC-SHA1

正如预期的那样,浏览器的结果是:

null --5564316845 --null --0 --0 --HMAC-SHA1

到目前为止这么好,现在;我创建了一个单独的WAR应用程序,使用JSF来模拟调用上面提到的WebService的客户端,其中我在facelet中有一个简单的按钮,它调用一个支持bean,后者又调用WebService,这里和#39;是支持大豆:

@Model
public class EloquaClientBacking {

    private static final String ELOQUA_TEST_SERVER_URL = "http://esteban.mora.com:8080/EloquaTest/api/oauth";

    private String consumerKey = "09fb64e1-8b5d-406c-b4d5-adf9d318a1d2";
    private String nonce = "9519484";
    private String signatureMethod = "HMAC-SHA1";
    private long timestamp = 1410986606;
    private float version = 1.0f;
    private String signature = "AZbD26DeXrEV6iNLqBAxSXwWURg=";

    public void personifyEloqua() throws URISyntaxException {

        try {
            Client client = ClientBuilder.newClient();

            WebTarget target = client.target(ELOQUA_TEST_SERVER_URL);

            Response oauthResponse = target.queryParam("oauth_consumer_key", consumerKey)
                    .queryParam("oauth_nonce", nonce)
                    .queryParam("oauth_signature_method", signatureMethod)
                    .queryParam("oauth_timestamp", timestamp)
                    .queryParam("oauth_version", version)
                    .queryParam("oauth_signature", signature)
                    .request()
                    .get();

            System.out.println("##Calling: " + target.getUri());

            if (oauthResponse.getStatus() == 200) {
                String entity = oauthResponse.readEntity(String.class);

                System.out.println("######### " + entity);

                FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage("### Entity: " + entity));
            } else {
                FacesContext.getCurrentInstance().addMessage("msg", new FacesMessage(oauthResponse.getStatusInfo().toString() + " - status-code: " + oauthResponse.getStatus()));
            }

            oauthResponse.close();
            client.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

此方法personifyEloqua()将创建一个客户端并向客户端执行GET请求,问题是我不断发现404未找到响应,我可以&#39似乎明白了为什么。

我已经尝试过将配置链接起来了:

client.target(URL).queryParam(etc,etc).queryParam(etc,etc).request().get();

client.target(BASE_URL).path("oauth").queryParam()....

没有任何作品,任何人都在想指出我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

事实证明,我对数据类型犯了一个愚蠢的错误:

WebService正在接收long oauth_version,但在我将服务更改为float之后,我发送了@QueryParam("oauth_version") float version,这一切都按预期工作了!