当前位置: 首页 > 知识库问答 >
问题:

Apache http组件返回java.net.未知的HostException:名称或服务未知

云曦之
2023-03-14

我正在尝试使用Apache Http组件4.5.1使用Instagram进行oauth登录,但未能成功获取访问令牌。

我很确定这是库本身的问题,因为如果我卷曲,我会得到我想要的结果。

所以,我尝试了几种不同的发布调用方式,但它们都给我相同的结果,所以我将发布我发现的最优雅的方式是使用Fluent-hc lib:

@Value("${instagram.client.id}")
private String clientID;

@Value("${instagram.client.secret}")
private String clientSecret;

@Value("${instagram.redirect.uri}")
private String redirectURI;

private static final String INSTAGRAM_ACCESS_TOKEN_URL = "https://api.instagram.com/oauth/access_token";    

private Content requestAccessToken(String code, UserType userType) throws IOException {
//      String authorization_header_string = URLEncoder.encode(clientID + ":" + clientSecret, "UTF-8");
        return Request.Post(INSTAGRAM_ACCESS_TOKEN_URL)
                .bodyForm(Form.form()
                        .add("client_id",  clientID)
                        .add("client_secret", clientSecret)
                        .add("grant_type", "authorization_code")
                        .add("redirect_uri", redirectURI + "?type=" + userType)
                        .add("code", code)
                        .build())
//              .addHeader("Authorization", authorization_header_string)
                .execute().returnContent();
    }

我得到的结果是:

Java语言网未知后异常:api。instagram。com:名称或服务未知java。网Inet6AddressImpl。lookupAllHostAddr(本机方法)java。网InetAddress$1。lookupAllHostAddr(InetAddress.java:922)java。网InetAddress。getAddressesFromNameService(InetAddress.java:1316)java。网InetAddress。getAllByName0(InetAddress.java:1269)java。网InetAddress。getAllByName(InetAddress.java:1185)java。网InetAddress。getAllByName(InetAddress.java:1119)org。阿帕奇。http。实施。conn.SystemDefaultDnsResolver。解析(SystemDefaultDnsResolver.java:45)组织。阿帕奇。http。实施。conn.DefaultHttpClientConnectionOperator。connect(DefaultHttpClientConnectionOperator.java:111)org。阿帕奇。http。实施。conn.poolighttpclientconnectionmanager。connect(poolighttpclientconnectionmanager.java:353)org。阿帕奇。http。实施。execchain。主要客户:。建立路由(MainClientExec.java:380)组织。阿帕奇。http。实施。execchain。主要客户:。执行(MainClientExec.java:236)org。阿帕奇。http。实施。execchain。ProtocolExec。执行(ProtocolExec.java:184)org。阿帕奇。http。实施。execchain。RetryExec。执行(RetryExec.java:88)组织。阿帕奇。http。实施。execchain。RedirectExec。执行(RedirectExec.java:110)组织。阿帕奇。http。实施。客户内部EHTTP客户端。执行(CloseableHttpClient.java:82)org。阿帕奇。http。实施。客户CloseableHttpClient。执行(CloseableHttpClient.java:55)org。阿帕奇。http。客户流利要求internalExecute(Request.java:173)组织。阿帕奇。http。客户流利要求执行(Request.java:177)HttpClient。doExecute(InternalHttpClient.java:184)org。阿帕奇。http。实施。客户CloseableHttpClient。执行(CloseableHttpClient.java:82)org。阿帕奇。http。实施。客户CloseableHttpClient。执行(CloseableHttpClient.java:55)org。阿帕奇。http。客户流利要求internalExecute(Request.java:173)组织。阿帕奇。http。客户流利要求执行(Request.java:177)

现在我不知道如何继续。我每次使用这个lib发出这个请求都会返回这个错误。尝试添加身份验证标头传递密钥:secret,但也不起作用。

我错过了什么?

附言:我在用docker

共有2个答案

元阳荣
2023-03-14

您的代码示例似乎没有使用HttpComponents API。基于教程中的示例,我生成了此代码。它返回一个400响应,因为它实际上是一个错误的请求,但至少它得到了一个响应。

public class HttpClientExample {
  private static final String INSTAGRAM_ACCESS_TOKEN_URL = "https://api.instagram.com/oauth/access_token";

  public static void main(String[] args) throws IOException {
    List<NameValuePair> formParams = new ArrayList<NameValuePair>();
    formParams.add(new BasicNameValuePair("client_id",  "someValue"));
    formParams.add(new BasicNameValuePair("client_secret",  "someValue"));
    formParams.add(new BasicNameValuePair("grant_type",  "someValue"));
    formParams.add(new BasicNameValuePair("redirect_uri",  "someValue"));
    formParams.add(new BasicNameValuePair("code",  "someValue"));

    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, Consts.UTF_8);

    HttpPost post = new HttpPost(INSTAGRAM_ACCESS_TOKEN_URL);
    post.setEntity(entity);

    HttpClient client = HttpClients.createDefault();
    HttpResponse response = client.execute(post);

    System.out.println(response.getStatusLine());
    System.out.println(response.getEntity());
  }
}
太叔航
2023-03-14

好的。它确实与Docker有关。当我尝试在Docker之外运行代码时,它就工作了。

所以,我所做的是:

$ping api。instagram。com公司

PING instagram。c10r。facebook。com(173.252.120.81)56(84)字节的数据。

instagram-p3-shv-12-frc3中的64个字节。fbcdn。净(173.252.120.81):icmp\U序列=1 ttl=74时间=146毫秒

由于我使用docker-compose,我添加了我的common.yml配置:

  extra_hosts:
    - "api.instagram.com:173.252.120.81"

现在它工作得很好。

 类似资料:
  • 在AWS EC2 T2上部署停靠的Spring Boot应用程序时,我遇到了这个“java.net.UnknownHostException:host.docker.internal:Name或service not known”问题。微实例。由于此错误,spring启动应用程序无法启动。 但奇怪的是,我没有在应用程序的任何地方使用变量“host.docker.internal”:不在代码中,不在

  • 问题内容: 我正在尝试使用httplib将信用卡信息发送到authorize.net。当我尝试发布请求时,得到以下回溯: 我这样建立我的请求: 要添加另一层,它正在我们的开发服务器上运行,该服务器具有httplib 2.6,并且在httplib.HTTPSConnection中没有source_address参数。 任何帮助是极大的赞赏。 =============================

  • 我们有一个私人空间,并提供了一个内部API的访问权限,这样我们就可以从私人空间应用程序访问它。因此,我们开发了一个演示Java应用程序来测试它。当我们尝试用HTTP连接服务时,堆栈跟踪会像这样结束。 当我们ping私有空间中的相应IP时,我们可以看到它已启动。但是当我们试图从Java应用程序中访问服务时,它就像上面那样结束了。 Java 代码是这样的: 有没有人有任何想法来解决这个问题? 谢谢你。

  • 问题可能是什么,如何解决?请帮帮我

  • 我正在尝试运行一个电子邮件收割机,当我在没有循环的情况下手动输入url时,我没有任何连接错误。 然而,当我从文件中加载url时,我得到以下错误“名称或服务错误” 回溯(最近一次调用):文件“/usr/lib/python3/dist-packages/urllib3/connection.py”,第141行,在新连接(self.host,self.port),self.timeout,**extr

  • 问题内容: 当我尝试将网页加载到终端时,它给出了错误。 我的PC上有互联网,并尝试通过家庭互联网连接。因此,我这里没有任何代理人参与。 并再次尝试,但并不幸运。 但是,如果我使用IP代替域名,则可以正常工作。 有什么线索吗? 问题答案: 问题是: 启用IPV6 DNS服务器错误 这是我的解决方法: IPV6禁用 开放终端 键入并输入登录为超级用户 输入root密码 键入将目录更改为 键入以在那里创