【问题标题】:HtttpResponseException: Passing input data via JSON to the serverHttpResponseException:通过 JSON 将输入数据传递到服务器
【发布时间】:2013-12-18 10:24:11
【问题描述】:

请看下面的代码

   package com.example.jsontest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText editText;

/** Called when the activity is first created. */

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    StrictMode.ThreadPolicy policy = new StrictMode.
    ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy); 

    setContentView(R.layout.activity_main);

    editText = (EditText)findViewById(R.id.edit_text);

    //Call The JSon
    try {
        //Get the JSON
        //JSONObject jObject = new JSONObject(getJson());

        //editText.append(jObject.toString());

    //  confidence
        //Put the JSON
        JSONObject getJsonObject = new JSONObject(putJson());
        //editText.append(getJsonObject.getString("created"));


    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace(); 
    }

  }



  private String putJson()
  {
      DefaultHttpClient  client = new DefaultHttpClient();

      StringBuffer sb = null;
      try {
          String postURL = "https://bigml.io/andromeda/prediction?username=XXXXXXXX;api_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXX";

          HttpPost req = new HttpPost(postURL);
          req.setHeader("Content-Type", "application/json");


          JSONObject requestObject = new JSONObject();
          requestObject.put("model",  "model/xxxxxxxxxxx");
          requestObject.put("input_data",  "000008:5");

          StringEntity reqEntity = new StringEntity(requestObject.toString());
          req.setEntity(reqEntity);

          HttpResponse res = client.execute(req);
          HttpEntity entity = res.getEntity();
          String responseString = new BasicResponseHandler().handleResponse(res);
          if (entity != null) {
              //EntityUtils.consume(entity);
          }

          sb = new StringBuffer("");


          sb.append(responseString);

      } catch (Exception ex) {
          ex.printStackTrace();
          sb = new StringBuffer(ex.toString());
      }

      return sb.toString();

  }
} 

首先,这是一个测试代码,这就是网络安全被覆盖的原因。

我正在尝试将数据发送到BigML.com 以获得预测。根据理论预测文件,数据应该像这样传递(见下图),这是页面 - https://bigml.com/developers/predictions

现在,每当我运行我的代码时,我都会收到以下错误

12-18 10:09:09.880: W/System.err(1331): org.apache.http.client.HttpResponseException: NOT FOUND
12-18 10:09:09.880: W/System.err(1331):     at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71)
12-18 10:09:09.889: W/System.err(1331):     at com.example.jsontest.MainActivity.putJson(MainActivity.java:124)
12-18 10:09:09.889: W/System.err(1331):     at com.example.jsontest.MainActivity.onCreate(MainActivity.java:58)
12-18 10:09:09.889: W/System.err(1331):     at android.app.Activity.performCreate(Activity.java:5104)
12-18 10:09:09.900: W/System.err(1331):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
12-18 10:09:09.900: W/System.err(1331):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
12-18 10:09:09.910: W/System.err(1331):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-18 10:09:09.910: W/System.err(1331):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-18 10:09:09.920: W/System.err(1331):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-18 10:09:09.920: W/System.err(1331):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 10:09:09.920: W/System.err(1331):     at android.os.Looper.loop(Looper.java:137)
12-18 10:09:09.943: W/System.err(1331):     at android.app.ActivityThread.main(ActivityThread.java:5041)
12-18 10:09:09.943: W/System.err(1331):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 10:09:09.950: W/System.err(1331):     at java.lang.reflect.Method.invoke(Method.java:511)
12-18 10:09:09.950: W/System.err(1331):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-18 10:09:09.950: W/System.err(1331):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-18 10:09:09.960: W/System.err(1331):     at dalvik.system.NativeStart.main(Native Method)
12-18 10:09:09.980: W/System.err(1331): org.json.JSONException: Value org.apache.http.client.HttpResponseException of type java.lang.String cannot be converted to JSONObject
12-18 10:09:09.980: W/System.err(1331):     at org.json.JSON.typeMismatch(JSON.java:111)
12-18 10:09:10.000: W/System.err(1331):     at org.json.JSONObject.<init>(JSONObject.java:158)
12-18 10:09:10.030: W/System.err(1331):     at org.json.JSONObject.<init>(JSONObject.java:171)
12-18 10:09:10.030: W/System.err(1331):     at com.example.jsontest.MainActivity.onCreate(MainActivity.java:58)
12-18 10:09:10.030: W/System.err(1331):     at android.app.Activity.performCreate(Activity.java:5104)
12-18 10:09:10.040: W/System.err(1331):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
12-18 10:09:10.050: W/System.err(1331):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
12-18 10:09:10.050: W/System.err(1331):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-18 10:09:10.093: W/System.err(1331):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-18 10:09:10.093: W/System.err(1331):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-18 10:09:10.100: W/System.err(1331):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 10:09:10.110: W/System.err(1331):     at android.os.Looper.loop(Looper.java:137)
12-18 10:09:10.120: W/System.err(1331):     at android.app.ActivityThread.main(ActivityThread.java:5041)
12-18 10:09:10.120: W/System.err(1331):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 10:09:10.153: W/System.err(1331):     at java.lang.reflect.Method.invoke(Method.java:511)
12-18 10:09:10.160: W/System.err(1331):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-18 10:09:10.160: W/System.err(1331):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-18 10:09:10.171: W/System.err(1331):     at dalvik.system.NativeStart.main(Native Method)

我知道身份验证数据是正确的,因为如果我只是将 url https://bigml.io/andromeda/prediction?username=xxx;api_key=xxxxxxxxxxxxxx" 粘贴到浏览器,那么我会得到一个预测数据的输出,它是在“没有”任何输入数据的情况下创建的。

我在这里做错了什么?

【问题讨论】:

  • 你能把你的 onCreate 方法也放在这里吗?那里似乎出了问题
  • @ToonBorgers:现在看看

标签: java android json web-services post


【解决方案1】:

您的请求似乎遇到了异常。

这段代码:

 } catch (Exception ex) {
      ex.printStackTrace();
      sb = new StringBuffer(ex.toString());
  }

  return sb.toString();

让您的方法返回异常的名称。如果你在你的 catch 中加入一个日志语句,你可以看到到底出了什么问题:

 } catch (Exception ex) {
      Log.e("MY_TAG", "Something went wrong here", ex);
      ex.printStackTrace();
      sb = new StringBuffer(ex.toString());
  }

  return sb.toString();

您可以检查 LogCat 以确切了解发生了什么问题。

【讨论】:

  • 我认为您需要完整的 HttpResponseException 堆栈跟踪才能完全理解这里的问题
【解决方案2】:
org.json.JSONException: Value org.apache.http.client.HttpResponseException of type java.lang.String cannot be converted to JSONObject

这只是意味着您收到的响应无法转换为 JSON,请检查您返回的字符串是否为有效的 JSON 字符串。

【讨论】:

    【解决方案3】:

    你是在 MainThread 上做网络 IO 吗?这是不允许的..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 2011-09-25
      • 1970-01-01
      相关资源
      最近更新 更多