从球衣客户端调用 post API 时出现 415 错误
415 error while calling post API from jersey client
我下面有 API,其中 returns 支持 access_token。
POST https://idcs-xxxxxxxxxbf08128c3d93a19c.identity.c9dev2.oc9qadev.com/oauth2/v1/token
在 header content-type is application/x-www-form-urlencoded
中。同样在 body 中,它包含以下参数。
我发送了用户名和密码,并通过基本身份验证对其进行了保护。当我从邮递员那里打电话时,它提供 access_token 。它还在我使用 HttpUrlConnection
消费时提供输出
url = new URL(tokenURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Authorization", auth);
connection.setRequestProperty("Accept", "application/json");
OutputStream os = connection.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
osw.write("grant_type=client_credentials&scope=" + scope);
以上代码运行正常。但是当我使用球衣时,它会出现 415 错误。我正在使用下面的代码。
String user="idcs-oda-zzzxxxxxf93560b94eb8a2e2a4c9aac9a3ff-t0_APPID";
String password="xxxxxxx-6f71-4af2-b5cc-9110890d1456";
String scope = "https://idcs-oda-xxxxxxxxxxxxxxxxe2a4c9aac9a3ff-t0.data.digitalassistant.oci.oc-test.com/api/v1";
String tokenURL = "https://idcs-xxxxxxxxxxxxxxxx28c3d93a19c.identity.c9dev2.oc9qadev.com/oauth2/v1/token";
HttpAuthenticationFeature feature= HttpAuthenticationFeature
.basicBuilder()
.nonPreemptive()
.credentials(user,password)
.build();
ClientConfig clientConfig = new ClientConfig();
clientConfig.register(feature);
Client client = ClientBuilder.newClient(clientConfig);
WebTarget webTarget= client.target(tokenURL);
PostDetails post= new PostDetails("client_credentials",scope); //Bean class to assign body parameter
Response response= webTarget.request()
.header("Content-Type", "application/x-www-form-urlencoded")
.post(Entity.json(post));
System.out.println(response);
有人可以body 告诉我我在响应行中犯了什么错误吗?
您需要在 request 方法上设置接受:
Response response= webTarget.request(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/x-www-form-urlencoded")
.post(Entity.json(post));
您还需要确保如果您的 API 接受 application/x-www-form-urlencoded
内容,那就是您要发送的内容。
目前,您正在根据 Entity.json(post)
的使用情况发送 application/json
内容。
我不知道分配给 post
的是什么类型,但您需要弄清楚如何将其转换为 Form
or a MultiValuedMap<String,String>
, and then use the form
method on Entity
以提交您的内容。
Response response= webTarget.request(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/x-www-form-urlencoded")
.post(Entity.form(postForm)); //assuming postForm typed as Form or MultiValuedMap<String,String>
猜测 post
,将 postForm
创建为 MultiValuedMap<String,String>
可能像下面这样简单(当然,您可以在请求之前放置)。
MultiValuedMap<String,String> postForm = new MultiValuedHashMap<>();
postForm.add("client_credentials",scope);
您需要的是:
Response response= webTarget.request()
.accept("application/json") // Accept field from header of request
.header("Content-Type", "application/x-www-form-urlencoded") //manually set content-tyoe
.post(Entity.entity(input, MediaType.TEXT_PLAIN)); // request body
查看 Jersey 实际发送的内容的最佳方法是注册记录器并记录网络。例如:
clientConfig.register(
new LoggingFeature(
new Slf4jLogger(this.getClass().getName(), null)));
Slf4jLogger 来自 org.apache.cxf:cxf-core
.
我下面有 API,其中 returns 支持 access_token。
POST https://idcs-xxxxxxxxxbf08128c3d93a19c.identity.c9dev2.oc9qadev.com/oauth2/v1/token
在 header content-type is application/x-www-form-urlencoded
中。同样在 body 中,它包含以下参数。
我发送了用户名和密码,并通过基本身份验证对其进行了保护。当我从邮递员那里打电话时,它提供 access_token 。它还在我使用 HttpUrlConnection
url = new URL(tokenURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Authorization", auth);
connection.setRequestProperty("Accept", "application/json");
OutputStream os = connection.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
osw.write("grant_type=client_credentials&scope=" + scope);
以上代码运行正常。但是当我使用球衣时,它会出现 415 错误。我正在使用下面的代码。
String user="idcs-oda-zzzxxxxxf93560b94eb8a2e2a4c9aac9a3ff-t0_APPID";
String password="xxxxxxx-6f71-4af2-b5cc-9110890d1456";
String scope = "https://idcs-oda-xxxxxxxxxxxxxxxxe2a4c9aac9a3ff-t0.data.digitalassistant.oci.oc-test.com/api/v1";
String tokenURL = "https://idcs-xxxxxxxxxxxxxxxx28c3d93a19c.identity.c9dev2.oc9qadev.com/oauth2/v1/token";
HttpAuthenticationFeature feature= HttpAuthenticationFeature
.basicBuilder()
.nonPreemptive()
.credentials(user,password)
.build();
ClientConfig clientConfig = new ClientConfig();
clientConfig.register(feature);
Client client = ClientBuilder.newClient(clientConfig);
WebTarget webTarget= client.target(tokenURL);
PostDetails post= new PostDetails("client_credentials",scope); //Bean class to assign body parameter
Response response= webTarget.request()
.header("Content-Type", "application/x-www-form-urlencoded")
.post(Entity.json(post));
System.out.println(response);
有人可以body 告诉我我在响应行中犯了什么错误吗?
您需要在 request 方法上设置接受:
Response response= webTarget.request(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/x-www-form-urlencoded")
.post(Entity.json(post));
您还需要确保如果您的 API 接受 application/x-www-form-urlencoded
内容,那就是您要发送的内容。
目前,您正在根据 Entity.json(post)
的使用情况发送 application/json
内容。
我不知道分配给 post
的是什么类型,但您需要弄清楚如何将其转换为 Form
or a MultiValuedMap<String,String>
, and then use the form
method on Entity
以提交您的内容。
Response response= webTarget.request(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/x-www-form-urlencoded")
.post(Entity.form(postForm)); //assuming postForm typed as Form or MultiValuedMap<String,String>
猜测 post
,将 postForm
创建为 MultiValuedMap<String,String>
可能像下面这样简单(当然,您可以在请求之前放置)。
MultiValuedMap<String,String> postForm = new MultiValuedHashMap<>();
postForm.add("client_credentials",scope);
您需要的是:
Response response= webTarget.request()
.accept("application/json") // Accept field from header of request
.header("Content-Type", "application/x-www-form-urlencoded") //manually set content-tyoe
.post(Entity.entity(input, MediaType.TEXT_PLAIN)); // request body
查看 Jersey 实际发送的内容的最佳方法是注册记录器并记录网络。例如:
clientConfig.register(
new LoggingFeature(
new Slf4jLogger(this.getClass().getName(), null)));
Slf4jLogger 来自 org.apache.cxf:cxf-core
.