【问题标题】:Unable to POST data using TLS 1.2无法使用 TLS 1.2 发布数据
【发布时间】:2016-09-07 18:17:26
【问题描述】:

我正在尝试将数据发布到仅使用 TLS1.2 的服务器 当我运行代码时,我从服务器收到以下响应。

HttpResponseProxy{HTTP/1.1 415 Unsupported Media Type [Date: Wed, 07 Sep 2016 17:42:57 CST, Server: , Strict-Transport-Security: max-age=63072000; includeSubdomains; preload, Pragma: no-cache, Content-Length: 0, charset: ISO-8859-1, X-ORACLE-DMS-RID: 0, X-ORACLE-DMS-ECID: 343fa6c0-ed24-4003-ad58-342caf000404-00000383, Set-Cookie: JSESSIONID=1ZMIvt1NqrtWpHgHs4mMmYyTPUGTOQgrA9biCE3Dok5v0gDCPXu6!681252631; path=/; secure; HttpOnly;HttpOnly;Secure, Cache-Control: no-store, P3P: policyref="/w3c/p3p.xml", CP="WBP DSP NOR AMT ADM DOT URT POT NOT", Keep-Alive: timeout=5, max=250, Connection: Keep-Alive, Content-Type: text/xml, Content-Language: en] [Content-Type: text/xml,Content-Length: 0,Chunked: false]}

我正在使用以下代码将数据发布到服务器。我正在使用 apache httpcomponents-client-4.5.2

private static Registry<ConnectionSocketFactory> getRegistry() throws KeyManagementException, NoSuchAlgorithmException {
        SSLContext sslContext = SSLContexts.custom().build();
        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
                new String[]{"TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
        return RegistryBuilder.<ConnectionSocketFactory>create()
                .register("https", sslConnectionSocketFactory)
                .register("https", sslConnectionSocketFactory)
                .build();
    }

    public static void main(String[] args) throws Exception
    {    
        PoolingHttpClientConnectionManager clientConnectionManager = new PoolingHttpClientConnectionManager(getRegistry());
        clientConnectionManager.setMaxTotal(100);
        clientConnectionManager.setDefaultMaxPerRoute(20);
        HttpClient client = HttpClients.custom().setConnectionManager(clientConnectionManager).build();
        HttpPost  request = new HttpPost("https://someserver.com/dataupload");
        File file = new File("C://Nible//code//_client//Request.xml");
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();        
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        builder.setContentType(ContentType.TEXT_XML);
        FileBody fileBody = new FileBody(file);
        builder.addPart("my_file", fileBody); 
        HttpEntity reqEntity = builder.build();
        request.setEntity(reqEntity);
        HttpResponse response = client.execute(request);
       System.out.println(response);
    }

你能告诉我我做错了什么吗?

我尝试使用下面的代码而不是 MultipartEntityBuilder。我仍然遇到同样的错误。

EntityBuilder builder = EntityBuilder.create();
builder.setFile(file);
builder.setContentType(ContentType.TEXT_XML);

如果我将空白请求发送到服务器,那么我也会收到相同的错误。空白错误意味着我没有在请求中提出任何内容

HttpPost  request = new HttpPost("https://someserver.com/dataupload");
 HttpResponse response = client.execute(request);

【问题讨论】:

  • 第一个内容类型是text/xml,第二个是text/html...最好坚持:选择一个简单的内容类型(即text/plain)并在实验中始终使用相同的内容。
  • @LittleSanti 对不起。 text/xml 也一样。我仍然遇到同样的错误。能否请您提出其他建议。
  • 还有文本/纯文本?
  • @LittleSanti 也一样。即使我没有在请求中传递任何值,我也会收到同样的错误。我猜在创建连接时出现了一些错误。
  • @LittleSanti 使用 ContentType.APPLICATION_XML 工作并解决了问题。

标签: apache-commons-httpclient apache-httpcomponents


【解决方案1】:

我怀疑你的代码中有这些行:

MultipartEntityBuilder builder = MultipartEntityBuilder.create();        
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setContentType(ContentType.TEXT_XML);

多部分实体不能是内容类型 xml。它们必须是以下类型之一:

  • 多部分/混合
  • 多部分/替代
  • 多部分/摘要
  • 多部分/并行

(见RFC 1341 7.2

我猜你应该为多部分实体使用这些内容类型之一,并将text/xml 设置为单个部分的内容类型:

FileBody fileBody = new FileBody(file, ContentType.TEXT_XML);

(另一个问题是我认为没有必要只为一个文件发送多部分:您可以省略MultipartEntityBuilder 对象并直接构建FileEntity。)

【讨论】:

  • 我再次在问题中添加了描述。但我仍然遇到同样的错误。
猜你喜欢
  • 2017-05-12
  • 1970-01-01
  • 2015-03-10
  • 2018-08-17
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
相关资源
最近更新 更多