java.io.IOException: сервер возвратил код ответа HTTP: 400 для URL: - PullRequest
0 голосов
/ 01 ноября 2018

Я выполняю запрос GET, и этот код, который работает для всех наших существующих тестов, выдает ошибку 400 для новой конечной точки. Я могу попасть в конечную точку штрафа в почтальоне. conn.getErrorStream () ничего не печатает. Кажется, код не работает (без исключения) прямо в url.openConnection. Если я делаю conn.getResponseCode () сразу после этой строки, он возвращает 400. Я подумал, что, возможно, ему не нравится символ канала, который у меня есть в моем запросе, но кодирую его с помощью URLEncoder.encode (resourceContext), а также URLEncoder.encode (baseUrl). + resourceContext) не помог и закончил тем, что выдал исключение MalformedURLException. Вот конечная точка, которую я хочу достичь (анонимная): https://usqa0003d.usa.company.com:17462/positions/1535000400000/CUR/USA|415|415|CUST|GL53I7TPYBYM|MATCHED

Когда я присоединяю отладчик к серверу, я хочу, чтобы ничего не происходило, поэтому запрос никогда не поступает на сервер. Я вхожу в openConnection, которая приводит к кроличьей норе, полной var5, var6 и т. Д. Я перешел на HttpsURLConnection, но там тоже нет кубиков. Любые другие предложения?

URL url = new URL(baseUrl + resourceContext);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod(requestType);
        if(messageLibraryJson) {
            conn.setRequestProperty("Content-Type", "application/json;class=true");
            conn.setRequestProperty("Accept", "application/json;class=true");
        } else {
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");
        }

        String userpass = username + ":" + password;
        String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
        conn.setRequestProperty("Authorization", basicAuth);

        if(requestType.equals("POST")) {
            OutputStream os = conn.getOutputStream();
            os.write(requestJson.getBytes());
            os.flush();
        }

        if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
            logger.error("ERROR in REST CLIENT");
            logger.error("URL = " + baseUrl + resourceContext);
            logger.error("Request = " + requestJson);
            throw new RuntimeException("Failed : HTTP error code : "
                    + conn.getResponseCode());
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream())));

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Действительно, это был '|' Чар, вызывающий проблемы. Если я сделаю следующее:

        String urlString = (baseUrl + resourceContext).replace("|", "%7C");
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

Это работает. Создается следующая строка urlString: https://usqa0003d.usa.company.com:17462/positions/1535000400000/CUR/USA%7C415%7C415%7CCUST%7CGL53I7TPYBYM%7CMATCHED

Однако, когда я делаю:

String enc = baseUrl + URLEncoder.encode(resourceContext);

Я получаю: https://clqa0003d.usa.company.com:17462/positions%2F1535000400000%2FCUR%2FUSA%7C415%7C415%7CCUST%7CGL53I7TPYBYM%7CMATCHED

Символ '/' заменяется на '% 2F' (в дополнение к символу канала) и по какой-то причине вызывает проблемы. Для справки, конечная точка фактически определена так:

@RequestMapping(value = "/{param1}/{param2}/{param3:.*}", method = RequestMethod.GET)

С конечной точкой уровня класса (как это называется ???) как:

@RequestMapping(value = "/positions",
    produces = {"application/vnd.cme.cdo+json", "application/json;class=true", "application/x-protobuf", "application/x-protobuf-text"},
    consumes = {"application/vnd.cme.cdo+json", "application/json;class=true", "application/x-protobuf", "application/x-protobuf-text"})
public class PositionController implements IPositionController {

Может кто-нибудь прокомментировать, почему преобразование '/' в '% 2F' вызывает проблемы?

0 голосов
/ 01 ноября 2018

Код ответа 400 указывает, что серверу не удалось обработать запрос, отправленный клиентом из-за неверного синтаксиса.

Я бы предложил еще раз проверить синтаксис (данные, которые вы пытались отправить на удаленный сервер)

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...