我试图通过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
答案 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外观字符串,几乎就像它没有被编码一样。我会回到这里过去,但是我已经改变了我的代码,以至于我不想冒失去它的风险。
感谢大家的帮助!