0

尝试将python代码转换为java代码以获得httppost请求,但始终得到400响应。尝试在我的电脑中使用与本地Web服务相同的代码,则不存在任何问题。请参阅Python代码:得到400响应httpurlconnection发送post请求

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

400 HTTP响应是关于错误的请求,因此您的请求结构中可能有错误,那么请您提供更多信息,例如“baseUrl”的值是什么?如果你不能提供这些信息,你至少可以展示它的结构。 –

回答

0

我可以看到你使用JSON对象的蟒蛇为您的请求参数和使用urlencode来转换JSON对象中以及形成url参数。 urlencode要求将Json对象作为参数,但这对于Java来说是不同的。

URLEncoder.encode方法需要一个String对象作为参数,那么你就需要在你的Java代码创建一个JSON对象,你应该做这样的事情:

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

现在,我知道你转换JSON对象为String对象(parameters.toString()),但它只是做了这样的事情:

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

因此,这不是一个很好形成的URL,为此得到了一个400 HTTP效应初探。

我与你分享URLEncoder类的文档。

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

我希望这个信息可以帮助你。

祝你好运。

+0

String parameters =“monitoredObjects = VZLab-IViewG10-2&monitoredObjectType = Probe”; 它以这种方式工作。谢谢 –

+0

不客气,如果你喜欢我的回答,请你批准吗? –

相关问题