2012-07-19 101 views
2

我试图通过HTTPPost发送JSONObject,但现在我收到400错误。400 JSON和HTTP POST的错误

我一直在使用服务器编码器,并用较简单的JSON对象进行更小更简洁的调用,但是我仍然收到相同的400错误。

我该如何解决它?

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.ByteArrayEntity; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicHeader; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 
import org.apache.http.protocol.HTTP; 
import org.apache.http.util.EntityUtils; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class LoginScreen extends Activity { 

    private Button loginButton; 
    private TextView resultText; 
    private EditText usernameText; 
    private EditText passwordText; 
    private EditText switchChoice; 
    private EditText installText; 
    private int i; 
    private String accessURL = "URL"; 
    private String accessNEW = ""; 
    public final String CONSUMER_KEY = "KEY"; 
    public final String CONSUMER_SECRET = "SECRET"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // Create the screen + pull back the saved instance state 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_screen); 

     // initialize the buttons and text view for usability in the later codes 
     loginButton = (Button) findViewById(R.id.btn_login); 
     resultText = (TextView) findViewById(R.id.lbl_result); 
     usernameText = (EditText) findViewById(R.id.txt_username); 
     passwordText = (EditText) findViewById(R.id.txt_password); 
     installText = (EditText) findViewById(R.id.txt_install); 
     switchChoice = (EditText) findViewById(R.id.txt_switch); 



     // create the onclick listener for the login button to start the code to 
     // login 
     loginButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       try { 
        // pull data from EditText Boxes and create the JSON object 
        // to send information HTTP 
        String text = switchChoice.getText().toString(); 
        i = Integer.parseInt(text); 
        JSONObject jOb = toJSON(); 
        Log.d("JSONObjectCreation", jOb.toString()); 
        // method to go through 
        processURL(jOb); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.login_screen, menu); 
     return true; 
    } 

    public JSONObject toJSON() throws JSONException { 
     JSONObject credentials = new JSONObject(); 
     try { 
      credentials.put("ConsumerSecret", CONSUMER_SECRET); 
      credentials.put("ConsumerKey", CONSUMER_KEY); 
      credentials.put("Password", "Sh0wT1me"); 
      credentials.put("Username", "sjones"); 

     } finally { 
     } 
     return credentials; 
    } 

    /* 
    * Subclass that executes the connection and authentication to the server 
    * using HTTPPost - Uses AsyncTask to execute the network connection on a 
    * different thread 
    * 
    * PARAMS: JSONObject -> input 
    */ 
    private class PostTask extends AsyncTask<JSONObject, Integer, String> { 
     // Dialog box to let user know that it is processing 
     private ProgressDialog Dialog = new ProgressDialog(LoginScreen.this); 

     // Before the execution of the background task, this is executed in the 
     // main thread 
     @Override 
     protected void onPreExecute() { 
      Dialog.setMessage("Logging In..."); 

      // forces the dialog to show in the main thread 
      Dialog.show(); 
     } 

     // done in background thread, so that the main thread is not jammed up 
     // preventing user interface usage 
     @Override 
     protected String doInBackground(JSONObject... jObj) { 
      int TIMEOUT_MILLISEC = 10000; // create timeout time of 10 seconds 
      HttpParams httpParams = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(httpParams, 
        TIMEOUT_MILLISEC); 
      HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC); 

      // create a new httpClient with the httpParams of timeout time 
      HttpClient client = new DefaultHttpClient(httpParams); 
      String responseBody = null; 
      try { 

       HttpPost request = new HttpPost(accessURL); 

       switch (i) { 
       case 1: 
        request.setEntity(new ByteArrayEntity(jObj.toString().getBytes("UTF8"))); 
        Log.d("request_entity", request.getEntity().getContent().toString()); 
       case 2: 
        StringEntity params =new StringEntity("{credentials"+jObj.toString()+"}"); 
         Log.i("String_Entity", params.toString()); 

        request.addHeader("content-type", "application/json; charset=utf-8"); 
        request.setEntity(params); 
       case 3: 
        StringEntity se = new StringEntity("{credentials" + jObj.toString()+"}"); 
        Log.i("String_Entity", se.toString()); 
        se.setContentEncoding("UTF-8"); 
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
        request.setEntity(se); 
       case 4: 

       } 

       HttpResponse response = client.execute(request); 
       int status = response.getStatusLine().getStatusCode(); 
       /* 
        switch (status) { 
        case 200: 

        HttpEntity entity = response.getEntity(); 
        if (entity != null) { 
         responseBody = EntityUtils.toString(entity); 
        } 
        break; 
       case 500: 
        responseBody = "500" + response.getStatusLine().getReasonPhrase(); 
        break; 
       } 
       */ 
       String statusS = Integer.toString(status); 
       Log.d("request_status", statusS); 
       return statusS + " " +response.getStatusLine().getReasonPhrase(); 
       //return responseBody; 
      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       Log.e("log_tag", "Error in http connection " + e.toString()); 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      resultText.setText(result); 
      Dialog.dismiss(); 
      Toast.makeText(getApplicationContext(), "Value updated", 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void processURL(JSONObject thing) { 
     // execute connection on new thread 
     new PostTask().execute(thing); 
    } 

} 

编辑: 设置实体开关部分是存在的,因为我不是肯定的,如果错误是从以何种方式我设置的实体,所以经过研究,我创建了一个开关,让我去通过JSONObject可以编码到实体的不同方法。

编辑: 这在今天我logcat的上前:

07-19 11:13:27.812: W/ThrottleService(91): unable to find stats for iface rmnet0 
07-19 11:15:18.862: A/NetworkStats(91): problem reading network stats 
07-19 11:15:18.862: A/NetworkStats(91): java.lang.IllegalStateException: problem parsing line: null 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:313) 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.server.NetworkManagementService.getNetworkStatsUidDetail(NetworkManagementService.java:1271) 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.server.net.NetworkStatsService.performPollLocked(NetworkStatsService.java:810) 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.server.net.NetworkStatsService.performPoll(NetworkStatsService.java:771) 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.server.net.NetworkStatsService.access$100(NetworkStatsService.java:128) 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.server.net.NetworkStatsService$3.onReceive(NetworkStatsService.java:610) 
07-19 11:15:18.862: A/NetworkStats(91):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:728) 
07-19 11:15:18.862: A/NetworkStats(91):  at android.os.Handler.handleCallback(Handler.java:605) 
07-19 11:15:18.862: A/NetworkStats(91):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-19 11:15:18.862: A/NetworkStats(91):  at android.os.Looper.loop(Looper.java:137) 
07-19 11:15:18.862: A/NetworkStats(91):  at android.os.HandlerThread.run(HandlerThread.java:60) 
07-19 11:15:18.862: A/NetworkStats(91): Caused by: java.io.FileNotFoundException: /proc/net/xt_qtaguid/stats: open failed: ENOENT (No such file or directory) 
07-19 11:15:18.862: A/NetworkStats(91):  at libcore.io.IoBridge.open(IoBridge.java:406) 
07-19 11:15:18.862: A/NetworkStats(91):  at java.io.FileInputStream.<init>(FileInputStream.java:78) 
07-19 11:15:18.862: A/NetworkStats(91):  at java.io.FileReader.<init>(FileReader.java:42) 
07-19 11:15:18.862: A/NetworkStats(91):  at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:272) 
07-19 11:15:18.862: A/NetworkStats(91):  ... 10 more 
07-19 11:15:18.862: A/NetworkStats(91): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
07-19 11:15:18.862: A/NetworkStats(91):  at libcore.io.Posix.open(Native Method) 
07-19 11:15:18.862: A/NetworkStats(91):  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:98) 
07-19 11:15:18.862: A/NetworkStats(91):  at libcore.io.IoBridge.open(IoBridge.java:390) 
07-19 11:15:18.862: A/NetworkStats(91):  ... 13 more 
: E/(): Device disconnected 
+0

您的'accessURL',是否曾设置为您要求回复的URL?我只看到'accessURL =“URL”;' – jnthnjns 2012-07-19 15:57:22

+0

有一个实际的网址,但我不允许将它公开发布。 – EndingWithAli 2012-07-19 16:14:55

+0

这么想,只是检查。您可能会检查此网站以供参考:http://www.checkupdown.com/status/E400.html – jnthnjns 2012-07-19 16:25:30

回答

0

我在一段时间后意识到错误来自doInBackground方法中的jObj变量。 我将尽我所能地描述错误,并从我所看到的: protected String doInBackground(JSONObject ... jObj) JSONObject变量实际上并不是JSONObject,因为' ...',所以当我使用jObj.toString()时,它返回了一些奇怪的非JSONObject查找字符串,就像它没有被编码。我会返回并在这里通过字符串,但是我已经改变了我的代码,所以我不想冒险失去它。

感谢大家的帮忙!

0

添加一个构造函数,以您的PostTask类。我不认为你可以将accessURL作为全局变量传递给类。

试着这么做:

private class PostTask extends AsyncTask<JSONObject, Integer, String> { 

    String accessURL; 

    public PostTask(Context c, String accessURL) { 
     this.accessURL = accessURL; 
    } 

} 

然后在你的processURL方法做:

new PostTask(this, accessURL).execute(thing); 

我希望你的作品。

+0

我不认为OP需要这样做。 accessURL应该已经在AsyncTask中可见。 – 2012-07-19 18:38:51

+0

试过了。没有工作 – EndingWithAli 2012-07-20 15:02:24

0

我不是在整个JSON的东西很好,但应该

StringEntity se = new StringEntity("{credentials" + jObj.toString()+"}");

StringEntity se = new StringEntity("{credentials: " + jObj.toString()+"}");

编辑:也许引号周围的单词凭据。再次,我不擅长JSON!

+0

我意识到,我发布这个后,所以我改变了它在我的代码,它仍然没有工作...“ – EndingWithAli 2012-07-20 14:27:24

+0

”“并不意味着围绕单词证书。我检查了api的例子。 – EndingWithAli 2012-07-20 15:02:14