2012-07-19 60 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