【问题标题】:Java httpclient 4.1 how to send post request with configurable portJava httpclient 4.1如何使用可配置端口发送发布请求
【发布时间】:2011-05-23 12:07:05
【问题描述】:

哇,我只是找不到任何有效的 httpclient 4.1 示例,使用非默认端口发送 post 请求 但可配置端口,我有这个代码,但它不工作

// lHashMapParams is with params getting form function .. 

List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
        for (String key : lHashMapParams.keySet()) {
            String val = lHashMapParams.get(key);
            params.add(new BasicNameValuePair(key,val));

}
String url = "https://foo.com";
int port = 8883;
String = "https";
UrlEncodedFormEntity query = new UrlEncodedFormEntity(params);
        HttpHost httpHost = new HttpHost(url,port,httpType); 

        HttpPost post = new HttpPost("/");
        post.setEntity(query);


        HttpResponse response_ = httpclient.execute(httpHost,post);

得到这个异常:

log4j:WARN Please initialize the log4j system properly.
java.net.UnknownHostException: https://foo.com
    at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:849)
    at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1183)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1136)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1109)
    at java.net.InetAddress.getAllByName(InetAddress.java:1072)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.resolveHostname(DefaultClientConnectionOperator.java:242)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:130)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
    at com.ut.HttpClientImpl.postHttpReqest(HttpClientImpl.java:75)  

简单的话如何定义端口?

【问题讨论】:

  • 该代码显示“未知主机”,而与端口无关。端口是 URL 的一部分。 http://foo.com:8888 将尝试连接到端口 8888 上的 foo.com
  • 我知道它就像它不知道端口,所以我确实将值放入新的 HttpHost(url,port,httpType);
  • 但这不是重点——在 DNS 中找不到主机,端口不相关。
  • 当我以这种形式执行代码时:androidsnippets.com/… 一切正常

标签: java https httpclient


【解决方案1】:

您正在尝试查找主机名https://foo.com ,这就是问题所在;查找应该针对foo.com。我不确定您是如何获得相关代码的,但值得花一些时间查看HttpClient tutorial

如果我没记错的话,下面的代码应该足够了:

HttpPost httpost = new HttpPost(url); //construct the complete URL i.e. action to post to
httpost.setEntity(entity);
response = httpclient.execute(httpost);

其中 url 将由 http/https 架构、主机名、端口和资源 URI 的其余部分构成。

【讨论】:

  • 是的,在HttpClient 的示例页面中查看基于表单的登录示例。
  • 我看到所有这些都是我问这个问题的方式,没有像 C cUrl 这样设置端口的方法,为什么我需要构建它愚蠢的字符串
  • 也许你应该花更多的时间在教程上。第 1 章展示了如何使用 URIUtils 来完成此操作。
  • 不好,我仍然需要构建查询,不要使用某种向量的 per's
  • 如果您使用 POST,为什么需要构建查询字符串?为什么不使用 POST 正文,它发生在您显然是指的 HTTP 实体上?我认为您需要先了解 HttpClient 中类的用途,然后再对其进行编程。了解 HttpClient 的对象模型并将其映射到 HTTP 协议对于确保您能够完成 HttpClient 支持的 HTTP 协议的任何方面都大有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多