java - 如何从 Java 向 json RESTful 服务发出 post 请求?

标签 java

我正在尝试从 java 向现有的 RESTful 服务发出 POST 请求,以便获取 json 响应并将其存储在字符串中。

假设 RESTful 服务 URL 如下:

https://myStore.com/REST-API/

这是一种有产品的商店,您想要搜索商品。为了进行搜索,您还必须发送请求正文,如下所示:

{
   "searchProduct": "Football"
}

为了发表这篇文章,我在 java 中实现了以下方法:

public String getJsonResponse(String searchProduct) throws Exception {

    String url = "https://myStore.com/REST-API/";
    String requestBody = "{\"searchProduct\": \"" + searchProduct + "\"}";

    URL obj = new URL(url);

    HttpsURLConnection connection = (HttpsURLConnection) obj
            .openConnection();

    connection.setDoOutput(true);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/json");

    OutputStream outputStream = connection.getOutputStream(); // <-- I get an exception.

    outputStream.write(requestBody.getBytes());
    outputStream.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(
            connection.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }

    in.close();

    return response.toString();

}

异常(exception)情况如下:

Exception in thread "main" java.net.UnknownHostException: myStore.com
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1283)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1258)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at com.stavros.restfulServices.Requester.getJsonRespondingResults(Requester.java:70)
at com.stavros.restfulServices.MyMain.main(MyMain.java:11)

我不知道为什么会遇到这个异常,但如果您有想法或者也遇到了同样的问题,如果您发布建议或答案,我将不胜感激。

最佳答案

我尝试运行您的代码并收到此错误

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head><title>301 Moved Permanently</title></head>
<body><h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.myStore.com/REST-API/">here</a>.</p>
<hr><address>Apache/2.4.7 (Ubuntu) Server at mystore.com Port 80</address></body></html>

意味着您需要重新验证 Web 服务的 URL,可能它已移动到其他主机。 https://en.wikipedia.org/wiki/HTTP_301

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;



public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      try {
        System.out.println(getJsonResponse("Football"));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

    public static String getJsonResponse(String searchProduct) throws Exception {

        String url = "https://myStore.com/REST-API/";
        String requestBody = "{\"searchProduct\": \"" + searchProduct + "\"}";

        URL obj = new URL(url);

        HttpsURLConnection connection = (HttpsURLConnection) obj
                .openConnection();

        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");

        OutputStream outputStream = connection.getOutputStream(); // <-- I get an exception.

        outputStream.write(requestBody.getBytes());
        outputStream.flush();

        BufferedReader in = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }

        in.close();

        return response.toString();

    }
}

关于java - 如何从 Java 向 json RESTful 服务发出 post 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37182884/

相关文章:

java - REST Web 服务是否支持范围 header 来提供 zip 文件?

java - FTPClient 在上传到 Android 上的 FTP 服务器时损坏图像?

java - 如何在 spring mvc 中将 JSON 对象从 ajax 传递到 Controller ?

java - 删除数组中的 0 值并调整大小

java - 使用模运算符测试整数的奇数

java - 为什么我不能发送模型? Spring Boot 2 - Thymealf

java - 八位字节由 4 个或更多零给出的 IP 地址是否为有效 IP 地址?

java - 嵌套ArrayList : Accessing private members

java - 使用 Apache POI 的空白列和行的空指针

java - 我想连续运行我的java线程