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

如何从 Java 向 json 回复服务发出发布请求?

赵钊
2023-03-14

我试图从java向一个现有的RESTful服务发出一个< code>POST请求,以便获得json响应并将其存储在一个字符串中。

让我们假设RESTful Service 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 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)

我不知道为什么我会得到这个例外,但如果你有一个想法或者你也面临同样的问题,如果你能提出建议或答案,我将不胜感激。

共有3个答案

越涵衍
2023-03-14

这个异常意味着您的主机未知。请确保您的url存在。

java.net.UnknownHostException: myStore.com
郎泰平
2023-03-14

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

不存在;请检查该网址。

宰父单弓
2023-03-14

我试图运行您的代码并得到此错误

<!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>

这意味着您需要重新验证webservice的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();

    }
}
 类似资料:
  • 问题内容: 当我在Node服务器上打印请求的内容时,在任何地方都看不到用户数据。 这是我的节点服务器: 这是Angular2代码: 任何人都可以帮我或解释如何处理角度的http请求。 问题答案: 那是你的服务器: 那是您的有角度的客户: 回购https://github.com/kuncevic/angular-httpclient- examples

  • 当按钮被按下时,我执行它

  • 可能重复:<br>Android,通过HTTP POST(SOAP)发送XML 如何在Android系统中发布SOAP服务请求? 请给我举个例子 谢谢你和我分享知识

  • 我目前正在使用Node开发一个web应用程序。js在后端使用Express并进行响应。js在前端。在尝试通过axios将用户数据发布到节点服务器时,我遇到了一个问题。当我使用x-www-form-urlencoded内容类型进行发布时,前端将发布到服务器,但发布数据的整个JSON显示在第一个元素的键字段中。当我将内容类型更改为json时,它将停止从前端发布任何内容。我已经尝试了向服务器进行卷曲,卷

  • 问题内容: 我读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供用于编写​​内容的输入流,并且不知道(或不在乎)内容的格式。 现在,我想用名称和密码的参数对URL进行常规发布。 这意味着我需要自己将名称和值对编码为流? 问题答案: 当前接受的答案已过期。现在,如果您想创建一个发布请求并向其中添加参数,则应该使用Mul

  • 问题内容: 我对使用roku和roku特定语言(BasicScript)非常了解。我需要对某些服务器进行api调用以获取频道。我不明白如何在roku中做到这一点。请提出建议。 问题答案: 这是直接执行此操作的方法,而不必依赖SDK中包含的代码库的语法: 阻止方法(所有程序执行停止,直到检索到URL): 非阻塞方法,您可以在等待数据时执行其他操作: