我正在尝试将JSON发布到Web服务,以便我可以在回复时获得JSON作为回复,我已经在Google中搜索过,但我发现的大部分响应都是针对Android但不针对核心Java,这个问题对于Swing应用程序,我将为代码提供我在下面使用的代码。
public class Connection extends Thread {
private String url1;
private JSONObject data;
String line;
//Constuctor to initialize the variables.
public Connection(String url1, JSONObject data) {
this.url1 = url1;
this.data = data;
start();
}
public void run() {
ConnectionReaderWriter();
}
//To fetch the data from the input stream
public String getResult() {
return line;
}
public String ConnectionReaderWriter() {
URL url;
HttpURLConnection connection = null;
ObjectOutputStream out;
try {
/*URL url = new URL(Url.server_url + url1); //Creating the URL.
URLConnection conn = url.openConnection(); //Opening the connection.
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data); //Posting the data to the ouput stream.
wr.flush();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
line=rd.readLine(); //Reading the data from the input stream.
wr.close();
rd.close();*/
url = new URL(Url.server_url + url1); //Creating the URL.
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("api_key", "123456");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
out = new ObjectOutputStream(connection.getOutputStream());
out.writeObject(data);
out.flush();
out.close();
} catch (MalformedURLException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
String nonet = "No Network Connection";
line = nonet;
} catch (IOException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
String nonet = "No Server Connection";
line = nonet;
}
return line; //Return te stream recived from the input stream.
}
}
评论代码是我之前用作文本编码到URL时使用的代码。函数调用如下所示
JSONObject json = new JSONObject();
json.put("username", username);
json.put("password", passwordenc);
Connection conn = new Connection(Url.login, json);
conn.join();
执行时我得到如下所示的异常
Jan 20, 2014 1:18:32 PM SupportingClass.Connection ConnectionReaderWriter
SEVERE: null
java.io.NotSerializableException: org.json.JSONObject
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at SupportingClass.Connection.ConnectionReaderWriter(Connection.java:74)
at SupportingClass.Connection.run(Connection.java:40)
请告诉我此代码中的问题或此方法的替代方法。
答案 0 :(得分:0)
我会给出答案:
将out.writeObject(data);
替换为out.write(data.toString().getBytes());
您尝试编写JSONObject
对象,writeObject()
方法将尝试序列化对象,但由于JSONObject
类未实现Serializable,因此会失败。
答案 1 :(得分:0)
JSon是文本,因此您无法使用ObjectOutputStream。 POST方法使用内容的第一行作为参数,因此在实际内容之前需要一个空行:
OutputStream stream = connection.getOutputStream();
stream.write('\r');
stream.write('\n');
out = new OutputStreamWriter(stream, "UTF-8");
out.write(data.toString());
out.flush();
out.close();
编辑:实际上我们需要CR LF,因此println()可能无法正常工作。
答案 2 :(得分:0)
如果您发现本地使用HttpURLConnection
很尴尬,您可能会使用抽象库。那里有很多强大的东西。其中一个是 DavidWebb 。您可以在该页面的末尾找到一长串备选方案。
使用此库,您的代码将更短且更易读:
JSONObject nameAndPassword = new JSONObject();
// set name and password
Webb webb = Webb.create();
JSONObject result = webb.post("your_serverUrl")
.header("api_key", "123456")
.useCaches(false)
.body(nameAndPassword)
.ensureSuccess()
.asJsonObject()
.getBody();
代码仅显示将在Thread的run()
方法中运行的部分。没有必要设置Content-Type
标题,因为这是通过检测您设置为正文的对象类型自动完成的。 Accept
标题也是如此。
我假设您从REST服务接收JSON对象,因为您将“Accept”标头设置为“application / json”。要接收普通字符串,可以写String result = ... .asString().getBody()
。
BTW该库是在开发时考虑到Android的,但它也可以与Swing或服务器端一起使用。也许您选择其他库(例如Jersey客户端),因为您对大小没有限制。 DavidWebb重约20千字节,而大多数其他库为您的部署工件添加数百KB。
另一件事:你使用JSONObject
。对于小型Web服务,这不是问题,但如果您必须编组许多和/或大型对象,您可以考虑使用JAXB + Jackson或Gson。更少的代码,更少的错误,更多的乐趣!