为什么 Jersey GET 请求客户端 return 404?
Why does Jersey GET request client return 404?
我在 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/
其中 RESTful 服务是使用 javax.ws.rs.core.Application
而不是部署描述符启动的。
@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,这里是支持豆:
@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
not found 作为响应,我可以'好像明白为什么了。
我已经尝试链接配置:
client.target(URL).queryParam(etc,etc).queryParam(etc,etc).request().get();
和
client.target(BASE_URL).path("oauth").queryParam()....
没有任何效果,有人介意指出我做错了什么吗?
谢谢!
事实证明,我在数据类型上犯了一个愚蠢的错误:
WebService 正在接收 long oauth_version
但我正在发送 float
,在我将服务更改为 @QueryParam("oauth_version") float version
后一切都按预期工作!
我在 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/
其中 RESTful 服务是使用 javax.ws.rs.core.Application
而不是部署描述符启动的。
@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,这里是支持豆:
@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
not found 作为响应,我可以'好像明白为什么了。
我已经尝试链接配置:
client.target(URL).queryParam(etc,etc).queryParam(etc,etc).request().get();
和
client.target(BASE_URL).path("oauth").queryParam()....
没有任何效果,有人介意指出我做错了什么吗?
谢谢!
事实证明,我在数据类型上犯了一个愚蠢的错误:
WebService 正在接收 long oauth_version
但我正在发送 float
,在我将服务更改为 @QueryParam("oauth_version") float version
后一切都按预期工作!