【问题标题】:Creating a Hastebin Paste with Java使用 Java 创建 Hastebin 粘贴
【发布时间】:2018-12-01 10:31:06
【问题描述】:

我正在尝试制作一个 java 程序,我可以给她一个字符串,它将它粘贴到 Hastebin(www.hastebin.com) 并将粘贴的 URL 打印到控制台,这是我拥有的代码: Main.java(主类):

public class Main {
    Hastebin hastebin;
    static String randomString = "HELLO";

    public static void main(String args[]) {
        System.out.println(Hastebin.paste((randomString)));
    }
}

我的 Hastebin.java 类:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Hastebin {

public static String paste(String content){
    final HttpClient client = HttpClient.newHttpClient();
    final HttpRequest request = HttpRequest.newBuilder(
            URI.create("https://hastebin.com/documents")
    ).POST(HttpRequest.BodyPublisher.fromString(content).build());

    final HttpResponse<String> response = client.send(request, 
    HttpResponse.BodyHandler.asString());
    final String responseContent = response.body();
    final JSONObject responseJson = new JSONObject(responseContent);
    final String key = responseJson.getString("key");
    return "https://hastebin.com/" + key;
    }
}

我的错误:

Error:(14, 48) java: cannot find symbol
symbol:   method fromString(java.lang.String)
location: interface java.net.http.HttpRequest.BodyPublisher

Error:(17, 92) java: cannot find symbol
symbol:   method asString()
location: interface java.net.http.HttpResponse.BodyHandler

Error:(19, 15) java: cannot find symbol
symbol:   class JSONObject
location: class Hastebin

Error:(19, 45) java: cannot find symbol
symbol:   class JSONObject
location: class Hastebin

非常感谢您的帮助。

【问题讨论】:

  • 应该是ofString,而不是fromStringasString。您还缺少 JSONObject 导入。

标签: java java-11 java-http-client


【解决方案1】:

鉴于您正在使用 JDK-11(存在非抱怨的 java.net.http 包),您使用的 API 已更改为 BodyPublishers.ofStringBodyHandlers.ofString。您可以在代码中将它们更新为:

final HttpRequest request = HttpRequest.newBuilder(URI.create("https://hastebin.com/documents"))
            .POST(HttpRequest.BodyPublishers.ofString(content)).build();

final HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

注意:API 已更改为在 Java9 的孵化器模块期间最初设计的内容,因此您可能会找到与之前语法相关的文档。

另外:这是来自 openjdk 的 sample for POST 请求。


此外,如GET JSON 示例中所述,如果您想将响应作为自定义对象读取,您可以使用自定义对象映射器:

class UncheckedObjectMapper extends com.fasterxml.jackson.databind.ObjectMapper {
    Map<String, String> readValue(String content) {
        try {
            return this.readValue(content, new com.fasterxml.jackson.core.type.TypeReference() {
            });
        } catch (IOException ioe) {
            throw new CompletionException(ioe);
        }
    }
}

然后将您的回复阅读为

final HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Map<String, String> mappedResponse = new UncheckedObjectMapper().readValue(response.body());

要解析上述完全限定的类名,您需要依赖于 jackson-databindjackson-core 工件。

注意:您可以在更通用的实现中使用readValue 来返回自定义对象类型。

【讨论】:

  • ... 对于JSONObject,您必须确保将 Jackson 库 添加到您的项目依赖项中。
  • 不知道应该从哪里下载Jackson,有链接吗?
  • @TalMoshel 一个可能的链接可能是 maven central - search.maven.org/artifact/com.fasterxml.jackson.core/…
  • 这是什么?我查了网站,但我什么都不懂。
  • @TalMoshel 它是一个依赖库。您可以检查下载选项并下载 jar 并将其作为外部依赖项包含在您的项目中。
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多