我在Android上遇到WebService问题。我收到400错误,但没有关于ErrorStream的信息。
我想要做的是使用JSON在WCF Web服务上发出POST请求。
我必须补充一点,我的服务已启用includeExceptionDetailInFaults
。我最后一次收到400错误,是因为我没有定义RequestProperty
。现在我没有在流中收到任何错误。
以下是代码:
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
// In my last error I had not included these lines. Maybe they are still wrong?
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Accept", "application/json");
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out);
outputStreamWriter.write(jsonObject.toString(), 0, jsonObject.length());
outputStreamWriter.flush();
//outputStreamWriter.close();
int code = urlConnection.getResponseCode();
System.out.println(code);
if(code == 400) {
BufferedInputStream errorStream = new BufferedInputStream(urlConnection.getErrorStream());
InputStreamReader errorStreamReader = new InputStreamReader(errorStream);
BufferedReader bufferedReader = new BufferedReader(errorStreamReader);
StringBuilder builder = new StringBuilder();
String aux = "";
while ((aux = bufferedReader.readLine()) != null) {
builder.append(aux);
}
String output = builder.toString(); // The output is empty.
System.out.print(output);
}
答案 0 :(得分:1)
从Square检查Retrofit库,对于GET / POST请求,尤其是REST,更简单,更轻松。我建议你试一试。它会让你的生活变得轻松。 您可以使用不同的JSON解析器,错误处理程序等。非常灵活。
使用改造的POST请求定义,它很简单:
可以指定一个对象用作带有@Body注释的HTTP请求主体。
@POST("/users/new")
void createUser(@Body User user, Callback<User> cb);
也可以声明方法以发送表单编码和多部分数据。
当方法上存在@FormUrlEncoded时,将发送表单编码数据。每个键值对都使用@Field进行注释,其中包含名称和提供值的对象。
@FormUrlEncoded
@POST("/user/edit")
User updateUser(@Field("first_name") String first, @Field("last_name") String last);
在Java界面中定义方法之后,如上所示实例化它:
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.soundcloud.com")
.build();
MyInterface service = restAdapter.create(MyInterface.class);
然后你可以同步或异步调用你的方法(如果你传递Callback实例)。
service.myapi(requestBody);
有关更多详细信息,请参阅GitHub上的改进文档(http://square.github.io/retrofit/javadoc/index.html)和示例。
答案 1 :(得分:0)
由于错误的URL或帖子中的错误JSON格式,可能会发生400错误(通常发生在我的情况下)。请检查那两个
使用HttpPost对象会让我的工作变得更容易
HttpPost post = new HttpPost(url);
if(payload != null){
try {
StringEntity entity = new StringEntity(payload,HTTP.UTF_8);
entity.setContentType(contentType);
post.setEntity(entity);
} catch (UnsupportedEncodingException e) {
LOG.d(TAG, "post err url : " + url);
LOG.e(TAG, "post err url" , e);
throw new Exception(1, e);
}
}
HttpResponse response=executeRequest(owner, post);