【问题标题】:post data to server on android将数据发布到android上的服务器
【发布时间】:2017-07-28 02:31:00
【问题描述】:

我正在尝试使用 cakephp api 将数据发布到服务器。使用邮递员我的 api 工作正常,但在 Android 上我遇到了一些问题。我为此使用了 asynctask,但我认为我可能对要发布的 json 有问题。 我收到一条错误消息告诉我

 org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

这是我的代码,你能告诉我它有什么问题吗?

public class AsycTaskManager {

    public static class AddApplication extends AsyncTask<String, Void, String> {
        String result ;

        @Override
        protected String doInBackground(String... params) {

            String addFlightPlanUrl = "http://xxx.xxx.xxx.xxx:8765/car/addapplication";
            String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjIsImV4cCI6MTUwMTczOTkyNH0.5dwPuoScLdI3ivkuJ6afpmST6D5MwuoAcOzQ0EGBLAY";

            String postData ;
            URL object = null;
            try {
                object = new URL(addFlightPlanUrl);
                HttpURLConnection con = (HttpURLConnection) object.openConnection();
                con.setDoOutput(true);
                con.setDoInput(true);
                con.setRequestProperty("Authorization", token);
                con.setRequestProperty("Accept", "application/json");
                con.setRequestProperty("Content-Type", "application/json");

                con.setRequestMethod("POST");
                JSONObject cred = new JSONObject();

                cred.accumulate("code", "2");
                cred.accumulate("name", "2");


                OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
                wr.write(cred.toString());
                wr.flush();
                wr.close();
                StringBuilder sb = new StringBuilder();
                int HttpResult = con.getResponseCode();
                if (HttpResult == HttpURLConnection.HTTP_OK) {

                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(con.getInputStream(), "utf-8"));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    br.close();
                    JSONObject jObj = new JSONObject(sb.toString());

                    result = jObj.toString();

                    if (result != null) {
                        return result;
                    }
                } else {
                    System.out.println(con.getResponseMessage());
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            Log.e("result","null "+result);
        }
    }
}

更新

调试后,我可能对 cakephp 有问题。我收到此错误消息:

Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknownon line 0
Warning: Cannot modify header information - headers already sent in Unknown on line 0
Warning (512): Unable to emit headers. Headers sent in file= line=0 [CORE/src/Http/ResponseEmitter.php, line 48]

但我不知道为什么它适用于邮递员并且它不适用于android!

【问题讨论】:

    标签: android json post


    【解决方案1】:

    根据异常的&lt;br 消息,我认为您的服务器期待邮递员发送的某些标头或类似内容,而您没有,那么服务器正在回答错误页面(这就是您获得 HTML 的原因
    标签。 您可以添加 Facebook 的 Stetho 工具来比较您发送的原始请求与 Postman 的请求。

    但是即使你解决了这个问题,我还是建议你停止使用AsyncTaskHttpURLConnection。有很多工具可以让你的生活变得更轻松。我认为Retrofit是您的最佳选择。

    希望对你有帮助,问候!

    编辑

    • 如果使用不正确,AsyncTask 可能会在旋转时给您带来问题,例如,您可能会造成内存泄漏。您可以在AsyncTask 找到很多关于 DO 和 DONT 的文章。
    • 如果你想使用HttpURLConnection然后手动解析响应就可以了,这没有问题,但是你必须自己做那些具体的事情,而有很多人喜欢使用像Retrofit这样的抽象库它在引擎盖下做同样的事情,但可能比你好太多,这让你处理对你来说真正重要的事情:你的业务逻辑。这只是我的建议。

    【讨论】:

    • 感谢您的回答。看来问题出在服务器而不是android。请检查我的更新。至于停止使用 AsyncTask ,你能解释一下为什么吗?!
    • 您应该首先检查 sb.toString() 是否包含 htlm 或 json。并且不要盲目地将其转换为 json 对象。而且使用HttpUrlConnection和Asynctask也没有错。
    • 注意 asynctask 有方向改变的问题是非常错误的,这表明你不理解可能发生内存泄漏的原因。 Asynctask 也不绑定到活动生命周期
    • 我的错!我不够清楚。 AsyncTask 本身没问题,但我想解释的是,如果你没有正确解耦代码并且你在活动中声明任务,人们通常使用它的方式会产生问题。然后,如果你旋转你的设备,你就会产生内存泄漏,因为任务将引用被破坏的活动。我的建议只是使用为我们处理这些事情的工具,当有可靠的工具时,我们不需要深入研究。感谢您的留言 Marcin。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多