【问题标题】:Post Request to WebService in Android在 Android 中向 WebService 发布请求
【发布时间】:2014-09-03 07:38:58
【问题描述】:

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

【问题讨论】:

    标签: java android .net json wcf


    【解决方案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);
    

    有关更多详细信息,请参阅改造文档 (http://square.github.io/retrofit/javadoc/index.html) 和 GitHub 上的示例。

    【讨论】:

    • 我会看看给你回复的。
    • 你有一个例子来说明如何通过改造来实现一个 POST 请求吗?我只能找到 GET 请求。
    • 同时检查来自同一个 Square 团队的 OkHTTP 库(用于网络)。它可以单独使用,也可以与 Retrofit 或 Picasso 库轻松集成。它处理默认 Android 网络客户端之间的差异,还具有以下功能:响应缓存、GZIP 压缩、连接重用(池)等。
    • 如何同步调用方法?感谢您的回答,我认为这是要走的路。我想让应用程序等到操作完成。也许有一个 ProgressDialog。
    • 在上面的例子中,我展示了如何同步调用它。但请注意在应用程序主(UI)线程中执行任何网络操作,在新的操作系统版本中,您将收到 NetworkOnMainThreadException。根据 Android 指南,您必须在后台线程中执行此操作。 Retrofit RestAdapter.Builder 具有 setExecutors 方法来设置 ThreadPool 以执行异步请求。阅读文档。此外,如果您想等到 request 完成,请将您的代码设置在 Callback 中传递给 request 方法,仅此而已。当您使用 Callback 参数定义请求时,它变为异步并且在工作完成时将触发回调
    【解决方案2】:

    由于 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-03
      • 2019-06-08
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      相关资源
      最近更新 更多