在Android中发布WebService请求

时间:2014-09-03 07:38:58

标签: java android .net json wcf

我在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);
       }

2 个答案:

答案 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);