2012-07-07 86 views
2

Iam无法将数据发布到服务器,出现错误。但它在curl脚本中工作正常。无法将数据发布到服务器,得到错误java.io.IOException:服务器返回的HTTP响应代码:415

Error reading URL 

     java.io.IOException: Server returned HTTP response code: 415 for URL: https://8.7.177.4/api/domains/amj.nms.mixnetworks.net/subscribers/9001?do_not_disturb=no 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
     at CurlAuthentication.authenticatePostUrl(CurlAuthentication.java:109) 
     at CurlAuthentication.main(CurlAuthentication.java:134) 
    Error reading URL 

以下是代码。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLSession; 


public class CurlAuthentication { 

    public void authenticatePostUrl() { 

     HostnameVerifier hv = new HostnameVerifier() { 

      @Override 
      public boolean verify(String urlHostName, SSLSession session) { 
       System.out.println("Warning: URL Host: " + urlHostName 
         + " vs. " + session.getPeerHost()); 
       return true; 
      } 
     }; 
     // Now you are telling the JRE to trust any https server. 
     // If you know the URL that you are connecting to then this should 
     // not be a problem 
     try { 
      trustAllHttpsCertificates(); 
     } catch (Exception e) { 
      System.out.println("Trustall" + e.getStackTrace()); 
     } 
     HttpsURLConnection.setDefaultHostnameVerifier(hv); 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     try { 
      URL url = new URL("www.stackoverflow.com"); 

      String credentials = "user" + ":" + "password"; 
      String encoding = Base64Converter.encode(credentials.getBytes("UTF-8")); 
      HttpsURLConnection uc = (HttpsURLConnection) url.openConnection(); 
      uc.setDoInput(true); 
      uc.setDoOutput(true); 
      uc.setRequestProperty("Authorization", String.format("Basic %s", encoding)); 
      uc.setRequestMethod("POST"); 
      uc.setRequestProperty("Content-Type", "application/xml"); 
      uc.setRequestProperty("Accept", "application/xml"); 
      uc.getInputStream(); 
      System.out.println(uc.getContentType()); 
      InputStream content = (InputStream) uc.getInputStream(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        content)); 
      String line; 
      while ((line = in.readLine()) != null) { 
       pw.println(line); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      pw.println("Invalid URL"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      pw.println("Error reading URL"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println(sw.toString()); 
    } 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     CurlAuthentication au = new CurlAuthentication(); 
     au.authenticatePostUrl(); 
    } 

    // Just add these two functions in your program 

    public static class TempTrustedManager implements 
      javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 

     public boolean isServerTrusted(
       java.security.cert.X509Certificate[] certs) { 
      return true; 
     } 

     public boolean isClientTrusted(
       java.security.cert.X509Certificate[] certs) { 
      return true; 
     } 

     public void checkServerTrusted(
       java.security.cert.X509Certificate[] certs, String authType) 
       throws java.security.cert.CertificateException { 
      return; 
     } 

     public void checkClientTrusted(
       java.security.cert.X509Certificate[] certs, String authType) 
       throws java.security.cert.CertificateException { 
      return; 
     } 
    } 

    private static void trustAllHttpsCertificates() throws Exception { 

     // Create a trust manager that does not validate certificate chains: 

     javax.net.ssl.TrustManager[] trustAllCerts = 

     new javax.net.ssl.TrustManager[1]; 

     javax.net.ssl.TrustManager tm = new TempTrustedManager(); 

     trustAllCerts[0] = tm; 

     javax.net.ssl.SSLContext sc = 

     javax.net.ssl.SSLContext.getInstance("SSL"); 

     sc.init(null, trustAllCerts, null); 

     javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(

     sc.getSocketFactory()); 

    } 


} 

做iam从上面的代码做错了什么? 我需要使用curl脚本来发布数据吗?

回答

3

嗯,Error 415已经指出:

415不支持的媒体类型

请求实体拥有的服务器或资源不支持的媒体类型。例如,客户端将图像上传为image/svg + xml,但服务器要求图像使用不同的格式。

不知道服务器期望你发送给他的规范,很难说出你错过了什么。它虽然好像你只想从服务器接收数据,而不是给他发送任何东西。

通过设置uc.setRequestProperty("Content-Type", "application/xml");你告诉服务器你hand him over一些XML数据(你不这样做),他可能也不会期望这一点,所以他给你的错误。

正如你在你的POST数据发送一些urlencoded的数据,试试设置为:

uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 
+0

的错误得到解决,但数据不会保存到服务器。 – developer 2012-07-07 12:57:23

+0

你想发送数据到服务器还是你想接收的东西?你现在得到哪个错误? – 2012-07-07 14:42:24

+0

我想通过post方法发送数据到服务器,上面的代码也是一样的。现在你的建议,iam没有得到任何异常,但数据不张贴到服务器。 – developer 2012-07-07 15:00:01

相关问题