получить ответ 400 httpurlconnection отправляет почтовый запрос

Попробуйте преобразовать код python в код java для запроса httppost, но всегда получайте ответ 400. попробуйте тот же код с некоторыми локальными веб-сервисами на моем компьютере, проблем нет. Пожалуйста, посмотрите код Python:

post_data = {'monitoredObjects':'VZLab-IViewG10-2','monitoredObjectType':'Probe'}

print(post_data)

postfields = urlencode(post_data)


response = BytesIO()

b = pycurl.Curl()

b.setopt(b.URL, base+"capture")

b.setopt(b.HTTPHEADER, ['username:'+username,'securitytoken:'+securitytoken])

b.setopt(b.SSL_VERIFYPEER, 0)

b.setopt(a.SSL_VERIFYHOST, 0)

b.setopt(b.WRITEDATA, response)

b.setopt(b.POST, 1)

b.setopt(b.POSTFIELDS, postfields)

b.perform()

b.close()

Мой Java-код:

public void method(){
    String securityToken = "12134";
    HashMap<String, String> header = new HashMap<String, String>();

    header.put("username", username);
    header.put("password", password);
    header.put("securitytoken", securityToken);

    String api = "capture";

    JsonObject parameters = new JsonObject();

    parameters.addProperty("monitoredObjects", System.getProperty("monitoredObjects"));

    parameters.addProperty("monitoredObjectType", System.getProperty("monitoredObjectType"));
    String captureResult = executePost(baseUrl, api, header, parameters.toString(), "POST");

    String captureid = Xml.getXPathValue(result, "//startCapture/isa:captureId/text()");
}

public static String executePost(String baseUrl, String api, HashMap header, String urlParameters, String httpMethod) {
    HttpURLConnection connection = null;
    try {
        // Create connection
        URL url = new URL(baseUrl + api);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod(httpMethod);
        connection.setRequestProperty("Content-Type", "application/json");

        connection.setRequestProperty("Content-Language", "en-US");

        connection.setRequestProperty("username", (String) header.get("username"));
        connection.setRequestProperty("securitytoken", (String) header.get("securitytoken"));

        /*
         * String userPassword = username + ":" + password; String encoding = new
         * sun.misc.BASE64Encoder().encode(userPassword.getBytes()); connection.setRequestProperty("Authorization", "Basic " +
         * encoding);
         */

        // connection.setRequestProperty("Accept-Encoding", "gzip");

        connection.setUseCaches(false);
        connection.setDoOutput(true);

        // Send request
        if (urlParameters != null) {
            String encodedString = URLEncoder.encode(urlParameters);
            OutputStream wr = connection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(wr, "UTF-8"));
            writer.write(encodedString);
            writer.flush();
            writer.close();
            wr.close();

            // wr.write(urlParameters.getBytes("UTF-8"));
            // wr.close();
        }
        int responseCode = connection.getResponseCode();
        logger.info("\nSending 'POST' request to URL : " + url);
        logger.info("Post headers : " + header);
        logger.info("Post parameters : " + urlParameters);
        logger.info("Response Code : " + responseCode);
        // Get Response
        if (responseCode == 200) {
            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            rd.close();

            logger.info("*** BEGIN ***");
            logger.info(response.toString());
            logger.info("*** END ***");
            return response.toString();
        }
        return null;
    } catch (Exception e) {
        logger.error(e.getMessage());
        return null;
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

person Kevin Chen    schedule 15.03.2016    source источник
comment
HTTP-ответ 400 касается неправильного запроса, поэтому у вас может быть ошибка в структуре вашего запроса, тогда не могли бы вы указать дополнительную информацию, например, каково значение baseUrl? Если вы не можете разместить эту информацию, вы можете показать ее структуру хотя бы, пожалуйста.   -  person hmrojas.p    schedule 15.03.2016


Ответы (1)


Я вижу, что вы использовали объект Json на python для параметров вашего запроса и использовали urlencode для преобразования этого объекта Json в правильно сформированные параметры URL. urlencode требует, чтобы объект Json был параметром, но это отличается от Java.

Метод URLEncoder.encode требует объект String в качестве параметра, тогда вам не нужно создавать объект Json в вашем коде Java, вы должны сделать что-то вроде этого:

...
String parameters = "monitoredObjects=VZLab-IViewG10-2&monitoredObjectType=Probe";
URLEncoder.encode(parameters);
...

Теперь я знаю, что вы преобразовали объект Json в объект String (parameters.toString()), но он просто сделал что-то вроде этого:

"{monitoredObjects:VZLab-IViewG10-2,monitoredObjectType:Probe}"

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

Я делюсь с вами документацией класса URLEncoder.

https://docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html#encode%28java.lang.String%29

Я надеюсь, что эта информация поможет вам.

Удачи.

person hmrojas.p    schedule 15.03.2016
comment
Строковые параметры = monitorObjects=VZLab-IViewG10-2&monitoredObjectType=Probe; Это работает таким образом. Спасибо - person Kevin Chen; 15.03.2016
comment
Добро пожаловать, если вам нравится мой ответ, не могли бы вы его одобрить, пожалуйста? - person hmrojas.p; 16.03.2016