JSON和HTTP POST出现400错误 [英] 400 Error with JSON and HTTP POST

查看:3676
本文介绍了JSON和HTTP POST出现400错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Im trying to send an JSONObject over HTTPPost, however now Im receiving a 400 error.

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

I've been going through with the server coder, and making smaller and more concise calls with a less complicated JSON object, however I still receive the same 400 error.

如何修复它?

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的不同方法实体。

The switch part for setting the entity is there because I wasnt sure if the error is from the manner in which I was setting the entity, so after research, I created a switch to let me go through the different methods that the JSONObject can be encoded to the entity.

编辑:
今天我的logcat出现了:

This came up in my logcat today:

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


推荐答案

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

I realized after some time the error came from the jObj variable in the doInBackground method. I'm going to try to describe the error to the best of my abilities, and from what I have seen: protected String doInBackground(JSONObject... jObj) The JSONObject variable isn't actually a JSONObject because of the '...', so when I used jObj.toString() it returned some weird sort of non-JSONObject looking string, almost like it wasn't encoded. I would go back and past the string here, however I've already changed my code so much that I dont want to risk losing it.

感谢大家的帮助!

这篇关于JSON和HTTP POST出现400错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆