【问题标题】:HttpURLConnection post doesn't workHttpURLConnection 帖子不起作用
【发布时间】:2018-05-19 13:28:59
【问题描述】:

我正在尝试向我的 API 发布一个对象,但它不起作用。

我的 API 方法如下所示

[Route("Route is working but wanna keep this address hidden")]
[System.Web.Http.Acceptverbs("POST")]
[HttpPost]
public void Post(Comment comment)
{
db.Comments.Add(comment);
db.SaveChanges();
}

所以我有我的 API 和这个方法,然后当我在我的 android 应用程序中按下一个按钮时,我希望它发布到这个方法,但没有任何东西被发布。

我的 Android 应用程序中的代码

public class ConnectionPost extends AsyncTask<String,String,String> {
    @Override
    protected String doInBackground(String... params) {
        URL url = null;
        try {
            url = new URL("Keeping this address hidden");



        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");

        JSONObject comment = new JSONObject();
        comment.put("Name","Joe");

        OutputStreamWriter ap_osw= new OutputStreamWriter(conn.getOutputStream());
        ap_osw.write(comment.toString());
        ap_osw.flush();
        ap_osw.close();

            Log.d("test", ""  + comment.toString());

        }
        catch (Exception e){

        }
        return "";
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
    }
}

当我单击我的按钮时,我会调用一个包含此代码的方法。

 ConnectionPost send = new ConnectionPost();
 send.execute();

在 LogCat 中,我可以看到我创建的对象,但没有发布任何内容,所以想知道我做错了什么?

抱歉,有些事情的命名不好,稍后会修复它。

【问题讨论】:

  • 如果您添加了正确的用户权限,您是否检查过您的 android 清单文件,并且您是否尝试过测试您的 API/服务器端?
  • 我在我的 android 清单文件中添加了互联网权限,并且我已经测试了我的 API 以查看它是否可以正常工作。

标签: android httpurlconnection


【解决方案1】:

您的代码对我来说运行良好,导致可怕的“在我的机器上运行”。

1) 清单中有&lt;uses-permission android:name="android.permission.INTERNET" /&gt; 吗?

2) 处理异常,它将帮助您调试。

3) 读取/记录来自服务器的响应,它将帮助您调试。

InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder result = new StringBuilder();
String line;
while((line = reader.readLine()) != null) {
    result.append(line);
}
reader.close();
in.close();
Log.d("test", result.toString());

很多时候连接失败的是配置而不是代码。你的代码很好。

【讨论】:

  • 很高兴听到我的代码在您的机器上运行。如果现在我的代码可以在你的机器上运行,但不能在我的机器上运行,那么你大多数人一直在做不同的事情,那么我们在谈论什么样的配置?
  • 在我的回答中,我谈到了添加 uses-permission 标签,即配置。其他时候是错误的 URL,我们没有记录它,所以我们看不到 URL 的配置错误导致错误。这就是我上面列出的 1、2、3 步骤的目的。
【解决方案2】:

我修复了它:) 在我的对象中我有一个 DateTime 字段,我在发布时尝试将其设置为 null,但它当然不起作用。将其更改为 DateTime.Now。

【讨论】:

  • 如果您听从我的建议并处理了异常,可能会更快地发现这一点。
  • 是的,我猜,但不仅如此。我还需要在我的代码中添加一个检查,以查看我的 API 方法是否返回了 responsecode 200,如果是这种情况,那么它就会开始发布。但是感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多