2014-02-15 80 views
0

我想在java中复制以下UNIX cURL命令:服务器返回的HTTP响应代码:400网址:HttpURLConnection的错误

卷曲-X POST http://api.nigelsmall.com/xml-cypher -d @测试/文件/ abba.xml

编辑:

更具体地讲,我试图复制在Java中,下列curl命令:

卷曲-X POST http://api.nigelsmall.com/xml-cypher -d “<?xml version='1.0' encoding='UTF-8' ?><group><member></member></group>

到目前为止,我有以下代码:

String urlString = "http://api.nigelsmall.com/xml-cypher"; 
    try { 
     URL url = new URL(urlString); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestProperty("Content-Type", "application/xml"); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("POST"); 
     String data = "<?xml version='1.0' encoding='UTF-8' ?><group><member></member></group>"; 
     OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); 
     out.write(data); 
     out.flush(); 


     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line; 
     while ((line = rd.readLine()) != null) { 
      System.out.println(line); 
     } 
     out.close(); 
     rd.close(); 
    } 


    catch (Exception e) { 
     System.out.println(e); 
     e.printStackTrace(); 
    } 

但产生java.io.IOException:服务器返回的HTTP响应代码:400网址:发生http://api.nigelsmall.com/xml-cypher。任何人都可以找到问题所在?

我能想到的唯一可能是我需要把我的XML放在一个文件中,并将它作为请求发送。但我不知道该怎么做。任何人都可以帮助我吗?提前致谢。

+0

我会设置一个日志代理(请参阅http://stackoverflow.com/questio ns/4939382/logging-post-data-from-request-body)并逐字节比较请求。 – user3159253

+0

发送该XML到该URL会产生一个'400'响应,无论它是否由'curl'或其他发送。我对这个问题是什么感到困惑。你的意思是你想能够读取错误响应体? –

+0

如果我在unix上执行以下命令 curl -X POST http://api.nigelsmall.com/xml-cypher -d“<?xml version ='1.0'encoding ='UTF-8'?>“ 我以”创建“的形式返回响应。如果你去链接“http://api.nigelsmall.com/xml-cypher并点击按钮转换为密码创建语句,你会明白我指的是什么.. – Ganesh

回答

1

这不是你的错。 Web服务的文档缺少一个重要的细节:

如果发布JSON,可以这样做。发布XML时,您必须提供XML,如果发布在HTML表单中:application/x-www-form-urlencoded

在服务的source code你可以看到:

def _convert(method): 
    a = request.accept_mimetypes.best_match(["application/json", "text/html"]) 
    if a == "application/json": 
     xml = request.get_data().decode("utf-8") 
    else: 
     xml = request.form["xml"] # <-- xml is a form field!! 
    # ...  

我和DavidWebb试过这是围绕HttpURLConnection只有一小包装和它的工作:

public void testNigelsmall() throws Exception { 

    String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + 
      "<group id=\"abba\">\n" + 
      " <member id=\"agnetha\">\n" + 
      " <name>Agnetha Fältskog</name>\n" + 
      " <birth date=\"1950-04-05\" />\n" + 
      " </member>\n" + 
      " <member id=\"frida\">\n" + 
      " <name>Anni-Frid Lyngstad</name>\n" + 
      " <birth date=\"1945-11-15\" />\n" + 
      " </member>\n" + 
      " <song id=\"waterloo\" release_date=\"1974-03-04\">\n" + 
      " <name>Waterloo</name>\n" + 
      " <length min=\"2\" sec=\"42\" />\n" + 
      " </song>\n" + 
      "</group>"; 

    Webb webb = Webb.create(); 
    Response<String> response = webb 
      .post("http://api.nigelsmall.com/xml-cypher") 
      .param("xml", payload) 
      .asString(); 

    assertEquals(200, response.getStatusCode()); 
    assertNotNull(response.getBody()); 
    assertTrue(response.getBody().startsWith("CREATE")); 
    assertTrue(response.getBody().contains("(abba)-[:member]->(frida)")); 
} 

的输出:

CREATE 
(abba), 
(agnetha {name:"Agnetha F\u00e4ltskog",`birth date`:"1950-04-05"}), 
(frida {name:"Anni-Frid Lyngstad",`birth date`:"1945-11-15"}), 
(waterloo {`length sec`:42,`length min`:2,name:"Waterloo"}), 
(abba)-[:member]->(agnetha), 
(abba)-[:member]->(frida), 
(abba)-[:song {release_date:"1974-03-04"}]->(waterloo) 
相关问题