我想将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是我的班级。
答案 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
)。
希望它可以帮到你, 亨利