JSON和HTTP POST出现400错误

时间:2012-07-19 15:49:40

标签: android json http-post httpclient

我试图通过HTTPPost发送JSONObject,但是现在我收到400错误。

我一直在使用服务器编码器,并使用不太复杂的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

3 个答案:

答案 0 :(得分: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);

我希望这适合你。

答案 1 :(得分:0)

我不是很擅长整个JSON,但应该

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

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

编辑:并且可能围绕单词凭证引用。再说一次,我不擅长JSON!

答案 2 :(得分:0)

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

感谢大家的帮助!