postmain报400,JSON和HTTP POST出现400错误

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

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.

How do I go about fixing it?

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 {

// 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);

}

}

EDIT:

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.

EDIT:

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.(FileInputStream.java:78)

07-19 11:15:18.862: A/NetworkStats(91): at java.io.FileReader.(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

解决方案

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.

Thanks for everyone's help!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值