PUT 请求使用邮递员工作但不使用 java、spring boot
温馨提示:
本文最后更新于 2024年04月12日,已超过 37 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
I am trying to make an API call in my Spring Boot project. The PUT request is working fine using postman and I am getting 204 status code(no-content). Whereas the JAVA code is throwing 500 internal server error. The URL generated from code (as per logs) is similar to the one in postman. Here is the partial code:
private void subscribe() {
String url = "https://api.linkedin.com/rest/eventSubscriptions/(developerApplication:urn%3Ali%3AdeveloperApplication%3A{dev_app_id},user:urn%3Ali%3Aperson%3A{person_id},entity:urn%3Ali%3Aorganization%3A{organization_id},eventType:ORGANIZATION_SOCIAL_ACTION_NOTIFICATIONS)";
url.replace("{dev_app_id}", DEVELOPER_APPLICATION_ID);
url.replace("{person_id}", "iTFpJkMpIl");
url.replace("{organization_id}", ORGANIZATION_ID);
// headers
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-Restli-Protocol-Version", "2.0.0");
httpHeaders.add("LinkedIn-Version", VERSION);
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.set(HttpHeaders.AUTHORIZATION, new StringBuilder("Bearer ").append(channel.getAccessToken()).toString());
//body
Webhook body = new Webhook(callback_url);
HttpEntity<Webhook> entity = new HttpEntity<Webhook>(body, httpHeaders);
logger.info("Hitting subscription API: {} with body: {}", url, getJson(entity.getBody()));
logger.info("Headers: {}", entity.getHeaders().toSingleValueMap());
try {
restTemplate.put(url, entity);
} catch (RestClientException e) {
e.printStackTrace();
}
}
// just to check logs
private String getJson(Webhook body) {
try {
return new ObjectMapper().writeValueAsString(body);
} catch (Exception e) {
logger.error("Error converting object to JSON.", e);
return "";
}
}
The Webhook
class:
public class Webhook {
private String webhook;
public Webhook(String webhook) {
this.webhook = webhook;
}
public String getWebhook() {
return webhook;
}
public void setWebhook(String webhook) {
this.webhook = webhook;
}
}
The documentation here states the URL required to be generated. The specific URNs are encoded.
The error:
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Server Error: "{"message":"Internal Server Error","status":500}"
at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:102)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:137)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:942)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:891)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:790)
at org.springframework.web.client.RestTemplate.put(RestTemplate.java:567)
at com.germin8.main.services.EventSubscriber.lambda$0(EventSubscriber.java:152)
at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at com.germin8.main.services.EventSubscriber.createSubscriptions(EventSubscriber.java:131)
at com.germin8.main.services.EventSubscriber.organizarionSubscriptionMonitor(EventSubscriber.java:99)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)
at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)
at io.micrometer.observation.Observation.observe(Observation.java:499)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
Here is my pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/>
</parent>
<groupId>com.demo</groupId>
<artifactId>linkedin-crawler</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>linkedin-crawler</name>
<description>Linkedin Crawling Service</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>1_maven.apache.org</id>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
</repository>
<repository>
<id>jcenter-snapshots</id>
<name>jcenter</name>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
I have tried
- hitting the endpoint without encoding.
- Using
exchange
instead ofput
.
restTemplate.exchange(url, HttpMethod.PUT, entity, String.class);
To check if the body is serialising correctly, I made a similar request to a local endpoint and it was correct too.
To check the headers, I had logged them and compared them to the ones in my postman request.
正文到此结束
- 本文标签: 家庭宠物
- 本文链接: https://www.coder6.net/article/2291
- 版权声明: 本文由蚂蚁原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权