0

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

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(); 
     } 
    } 
} 
+0

Ответ на HTTP-запрос 400 о некорректном запросе, поэтому у вас может быть ошибка в структуре запроса, тогда вы могли бы добавить дополнительную информацию, например, какова ценность «baseUrl»? Если вы не можете поместить эту информацию, вы можете показать ее структуру, по крайней мере, пожалуйста. –

ответ

0

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

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

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

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

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

Так что это не хорошо сформирован URL, по этой причине вы получите 400 HTTP réponse.

Сообщаю вам документацию класса URLEncoder.

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

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

Удачи.

+0

Строковые параметры = "monitoredObjects = VZLab-IViewG10-2 & monitoredObjectType = Probe"; Он работает таким образом. Спасибо –

+0

Если вы хотите мой ответ, не могли бы вы его одобрить, пожалуйста? –