【问题标题】:URL parameter is getting modifiedURL 参数正在被修改
【发布时间】:2019-12-12 15:59:56
【问题描述】:

我写了一个微服务,把http call变成API,然后通过Angular 7获取数据。代码如下。
Connector Application

package com.ajay.dashboard.service;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class DellDashboardConnectorApplication {

    public static void main(String[] args) {
        SpringApplication.run(DellDashboardConnectorApplication.class, args);
    }

    @Bean
    public RestTemplate getRestTemplate() {

        return new RestTemplate();
    }
}  

Connector Controller

package com.ajay.dashboard.service.controller;

import java.net.URI;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

/*
 * Created by Kulkaa
 */

@RestController
public class DellDashboardController {

    private static final Logger logger = LoggerFactory.getLogger(DellDashboardController.class);

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(method = RequestMethod.GET, value = "/incident", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> retrieveAllCircles(HttpServletRequest request) {
        logger.info("DellDashboardController -> retrieveAllIncidents : invoked.");

        String formUrl = "https://<api>/api/now/table/incident";

        final String sysparm_query = "incident_stateNOT%20IN6%2C7%5Eassignment_group%3D4122c7f8f09cc1002283ac3a043ae3e6";
        final String sysparm_display_value = "true";
        final String sysparm_exclude_reference_link = "true";
        try {
            Map<String, String> params = new HashMap<String, String>();
            URI actualUrl = UriComponentsBuilder.fromUriString(formUrl).buildAndExpand(params).toUri();
            actualUrl = UriComponentsBuilder.fromUri(actualUrl).queryParam("sysparm_query", sysparm_query)
                    .queryParam("sysparm_display_value", sysparm_display_value)
                    .queryParam("sysparm_exclude_reference_link", sysparm_exclude_reference_link)
                    .build().toUri();
            HttpHeaders headers = new HttpHeaders();
            headers.add("Authorization", "<authorization code>");
            headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
            HttpEntity<String> entity = new HttpEntity<String>(headers);
            return restTemplate.exchange(actualUrl, HttpMethod.GET, entity, String.class);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return retrieveAllCircles(request);

    }

}  

当我在 tomcat 中将其作为 Spring boot app 运行时,incident_stateNOT%20IN6%2C7%5Eassignment_group%3D4122c7f8f09cc1002283ac3a043ae3e6 被修改为 incident_stateNOT%2520IN6%252C7%255Eassignment_group%253D4122c7f8f09cc1002283ac3a043ae3e6。由于这种不必要的修改,我无法连接到我的 API。我无法弄清楚是什么导致了这种修改。是什么导致了这种修改?

P.S:mvn clean install 运行完美,没有任何错误。

【问题讨论】:

  • 是的,sysparm_query 将被 URL 编码。这是一件好事。
  • 但是我不明白它在运行微服务时是如何被修改的......
  • 您获得了双重 URL 编码。确定原因。
  • 为什么这被否决了?

标签: java micro


【解决方案1】:

您正在使用的其中一个库正在对 URL 进行 url 编码,sysparm_query 已经进行了 url 编码,因此您将 % 更改为 %25 等等。因此,您可能希望将 sysparm_query 更改为尚未进行 url 编码。

【讨论】:

  • 好的,所以我添加了这一行:String final_sysparm_query = URLEncoder.encode(sysparm_query, "UTF-8");
  • 添加另一层编码不是会让情况变得更糟吗?好像你想解码。
  • 然后我可以使用URIBuilder,它可以按原样接受参数。
【解决方案2】:

%25表示有hex(25)码的ASCII字符——就是%字符。

这是正确的行为,因为您在 sysparm_query: "incident_stateNOT%20IN..." 中,并且 % 字符被编码为 %25 以通过 url 参数发送。

【讨论】:

  • 但我不想发送%25。我要发送%2
  • 在另一边,%25 应该被编码回%
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2012-12-11
  • 2018-03-07
  • 2018-09-14
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多