使用身份验证将POST数据发送到REST服务

时间:2015-03-25 08:14:20

标签: java rest authentication resteasy

我想将JSON数据发送到包含身份验证的REST服务,但是当我尝试运行此代码时,它会抛出RuntimeException和HTTP代码302。但是该链接通过REST客户端正常工作。我认为我的代码无法向链接提供身份验证详细信息。

我尝试了很多组合,但它仍然无法正常工作。任何人都可以建议我哪里出错了吗?

JSONObject obj=new JSONObject(req); //JSON Object
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
        Boolean.TRUE);
Client client = Client.create(clientConfig);
//Authentication filter
client.addFilter(new HTTPBasicAuthFilter("username", "password"));
WebResource webResource = client.resource(
        "http://licruleswb-dev.cloudapps.cisco.com/LicenseRules/rest/invokeRule");
ClientResponse response = webResource.accept("application/json").type(
        MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, obj.toString());
if (response.getStatus() != 200) {
    throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}

这是错误:

ERROR:Exception in thread "main" java.lang.RuntimeException: Failed :
        HTTP error code : 302
    at Test2.main(Test2.java:64)

Test2是我的班级。

2 个答案:

答案 0 :(得分:0)

您使用的是哪种框架?泽西?您可以尝试使用以下方式设置基本身份验证:

Authenticator.setDefault(new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password".toCharArray());
            }
});

答案 1 :(得分:0)

您似乎使用Jersey REST客户端。您需要注意,此方法在2.5版中已弃用,在2.6版中已删除。在更高版本的Jersey中,您需要使用:

// Send with all calls
HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic(
                                               "username", "password");

// Send with a single call
Response response = client.target("http://...").request()
    .property(HTTP_AUTHENTICATION_BASIC_USERNAME, "username")
    .property(HTTP_AUTHENTICATION_BASIC_PASSWORD, "password").get();

有关详细信息,请参阅此链接:https://jersey.java.net/documentation/latest/client.html#d0e5181

您可以在应用程序中启用跟踪或使用外部HTTP代理(如tcpmon)查看实际发送的请求(如果有内容标题Authorization)。

希望它可以帮到你, 亨利