将 POST 从 api 转发到另一个时出现错误代码 415

Posted

技术标签:

【中文标题】将 POST 从 api 转发到另一个时出现错误代码 415【英文标题】:Error code 415 when forwarding a POST from an api to another 【发布时间】:2019-07-25 17:19:23 【问题描述】:

我正在将一个应用程序/json 类型从邮递员客户端发送到一个 java API,该 API 将所有请求转发到该案例的特定 API。 在这个具体案例中,我有一个登录 API,我想集中代码听到这个 JSON:

来自邮递员的 JSON


    "name": "random name",
    "password": "random passwd"

执行转发的 API

@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String redirectHttpRequest(HttpServletRequest request, @Value("$endpoint") String newURL,
        HttpServletResponse response) throws IOException 

    try 

        RestTemplate restTemplate = new RestTemplate();
        String result = null;


        String body = IOUtils.toString(request.getReader());

        if (request.getMethod().equals("GET")) 
            // result = restTemplate.getForObject(redirectUrl.toString(), String.class);
         else if (request.getMethod().equals("POST")) 
            result = restTemplate.postForObject(newURL, body, String.class);

        
        return result;

     catch (HttpClientErrorException e) 
        System.out.println(e);
        return "OLA";
    


新的 URL 是另一个 API 的 URL(在这种情况下,它是 localhost:8080 并且来自 application.properties 文件)。

我已经通过邮递员测试了登录 API,它可以工作,但是当我尝试将其连接到该转发 API 时,我收到以下错误:

org.springframework.web.client.HttpClientErrorException: 415 null。

我想知道我做错了什么或另一种方法。

邮递员电话

第二个端点代码

传递给第二个端点的正文值

用户类

公共类用户

private String name;

private String password;

private List<String> groups;

public User(String name, String password) 
    this.name = name;
    this.password = password;
    this.groups = new ArrayList<String>();


public User() 



public String getName() 
    return this.name;


public String getPassword() 
    return this.password;


public List<String> getGroups() 
    return this.groups;


public String toString() 
    return "User: " + this.name + "\nGroups: " + this.groups;

【问题讨论】:

为了澄清的目的,两个端点都在同一台服务器上吗? localhost:8080 在你的情况下? 不,它们在不同的服务器上。一个在 8080 上,另一个在 8082 上 所以localhost:8082 上的第一个和localhost:8080 上的第二个?相同的服务器,但不同的端口 转发的是localhost:8082/forward,登录的是localhost:8080/login。我可以在他们两个之间进行获取请求,但不能发帖,我不知道为什么。 您能否将postForObject 调用时bodynewURL 中的值添加到您的帖子中,以确保它们看起来正确 【参考方案1】:

问题是您收到了415 错误代码。这意味着您的/login 端点不期望您发送给他的有效负载类型,请参阅here

415(不支持的媒体类型)

415 错误响应表明 API 无法处理客户端提供的媒体类型,如 Content-Type 请求标头所示。例如,如果 API 只愿意处理格式为 application/json 的数据,则包含格式为 application/xml 的数据的客户端请求将收到 415 响应。

例如客户端上传图片为image/svg+xml,但服务器要求图片使用不同的格式。

我认为这是因为当您调用postForObject 时,您并没有告诉您有效负载的媒体类型。因此,不是单独发送 json 字符串,而是需要将其包装到一个 HttpEntity 中,该 HttpEntity 包含正文以及指定要转发的有效负载的媒体类型的标头。试试这个:

...
 else if (request.getMethod().equals("POST")) 
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
    HttpEntity<String> entity = new HttpEntity<>(body, headers);
    result = restTemplate.postForObject(newURL, entity, String.class);

...

【讨论】:

错误依旧出现,body有我帖子的body,新的url是登录api运行的url,也就是localhost:8080/login,要不要打印body细绳?两者都消耗 MediaType.APPLICATION_JSON_UTF8_VALUE 可以试试把body改成"name":"random name", "password":"random passwd" 我已将我的邮递员信息放在我的问题上,这是你想要的吗? 我的意思是您在正文中使用的 JSON 字符串: name:"random name", password"random passwd" 不是有效的 JSON,所以这可能是问题所在。所以我希望您尝试使用有效的 JSON 字符串:"name":"random name", "password":"random passwd" 我把我的字符串主体和你提供的信息放在一起,它仍然不起作用,同样的错误。postForObject 的第二个参数是我想在另一个 api 上使用的信息,对吗?跨度>

以上是关于将 POST 从 api 转发到另一个时出现错误代码 415的主要内容,如果未能解决你的问题,请参考以下文章

发出发布请求时出现NodeJS CORS错误

将 JSON POST 请求从一个 REST API 转发到另一个

尝试使用 Spotify Web Api 将歌曲添加到另一个协作播放列表时出现 403 禁止错误

com.netflix.zuul.exception.ZuulException:当我调用 POST 方法调用时出现转发错误

将表单提交到 servlet 时出现 404 错误 [重复]

从泽西客户端调用 post API 时出现 415 错误