以下代码在Spring中将HTTP发送到REST:
...
HttpURLConnection connection = null;
InputStream input = null;
BufferedWriter output = null;
BufferedReader reader = null;
String result = null;
try {
connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json");
//Send data
output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
output.write(data);
output.flush();
//Read response
int responseCode = connection.getResponseCode();
if (responseCode >= 400) {
input = connection.getErrorStream();
} else {
input = connection.getInputStream();
}
reader = new BufferedReader(new InputStreamReader(input));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
result = "Status " + responseCode + ".\n" + sb.toString();
...其中url包含REST端点和数据,其中JSON被转换为具有POST中所需的用户属性的字符串。
问题是,尽管POST按预期工作,但在获得HTTP状态201之后,我无法获得API返回的响应体(但它在出现错误时工作,例如HTTP状态409)。奇怪的是,readline()函数在第一次读取时总是返回null。API可以很好地从Postman调用它,甚至可以从Eclipse中的一个Java项目运行该代码。
我的compileSdkversion和targetSdkVersion设置为25。
我将我的代码与网络上的许多HttpURLConnection示例进行了比较,在这里和那里应用更改,但没有成功.
有什么想法吗?
发布于 2017-05-16 15:31:28
在比较了从Postman和Android应用程序发送的header之后,我注意到通过将报头Accept: */*添加到POST请求中(正如Postman所做的那样),它按预期的方式工作。根据HTTP规范:一个没有任何Accept字段的请求意味着用户代理将接受任何媒体类型的响应。因此,它应该在没有accept报头的情况下工作(就像GET到相同的API那样)。
对我来说,无论是Spring API方面的错误、错误配置还是“正常”行为,都与Android模块无关。
https://stackoverflow.com/questions/43984333
复制相似问题