Android 发送JSON数据问题

向往外面世界的人 2014-10-31 11:03:13
这个问题困扰一天了,还是没能解决,故来求助。
首先说说我的webserver接收JSON数据的格式
{
"name":"aaa"
"password": “bbb”
}
然后附上两个代码:
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); 
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "aaa");
jsonObject.put("password", “bbb”);
nameValuePair.add(new BasicNameValuePair("jsonString", jsonObject
.toString()));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));

使用这个发送的JSON格式会变成
[ jsonString= { "name":"aaa"
"password": “bbb” } ] 然后请求失败,400错误
我System.out.println(jsonObject )输出的格式是正确的,但是硬要套上NameValuePair这个才可以,蛋疼,这样格式就不对了

然后我又找到一个不用带套的办法...
我是代码:

List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "aaa");
jsonObject.put("password", “bbb”);
StringEntity entity = new StringEntity(jsona.toString());
httpPost.setEntity(entity);

还是报出400的错误,请求失败...
我试着输出System.out.println(entity),给出我看不懂的东西,估计也是格式不对吧!
实在没招了,请各位大大帮帮忙。
...全文
382 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 heaimnmn 的回复:
400不是服务器那边的错误么,,,
不是,服务器我测试了没有问题,用客户端输出的JSON去测试服务器无法理解导致的错误
coffee-time 2014-10-31
  • 打赏
  • 举报
回复
估计是没加请求头,你用了StringEntity还得告诉服务器这是JSON格式而不是普通String httpPost.setHeader("Content-Type", "application/json");
  • 打赏
  • 举报
回复
引用 3 楼 ITbailei 的回复:
当然格式错误了,既然是post请求你就应该使用post的方式提交,要加上&格式,使用下面的代码,我已经注释的很清楚另外:
请问可有给个完整点的代码吗? 两个方法需要传送的参数不知道该怎么写
dali_yan 2014-10-31
  • 打赏
  • 举报
回复
当然格式错误了,既然是post请求你就应该使用post的方式提交,要加上&格式,使用下面的代码,我已经注释的很清楚另外:

/**
	 * 发送Post请求到服务器 ,並返回請求結果
	 * 
	 * @param params
	 *            請求參數
	 * @param encode
	 *            請求的編碼格式
	 * @param urlString
	 *            請求的URL地址
	 * @return 返回讀取到的字符串
	 */
	public static String submitPostData(Map<String, String> params,
			String encode, String urlString) {
		URL url = null;
		try {
			url = new URL(urlString);
		} catch (MalformedURLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		byte[] data = getRequestData(params, encode).toString().getBytes();// 获得请求体
		try {
			HttpURLConnection httpURLConnection = (HttpURLConnection) (url)
					.openConnection();
			httpURLConnection.setConnectTimeout(5000);// 设置连接超时时间
			httpURLConnection.setDoInput(true);// 打开输入流,以便从服务器获取数据
			httpURLConnection.setDoOutput(true);// 打开输出流,以便向服务器提交数据
			httpURLConnection.setRequestMethod("POST");// 设置以Post方式提交数据
			httpURLConnection.setUseCaches(false); // 使用Post方式不能使用缓存
			// 设置请求体的类型是文本类型
			httpURLConnection.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			// 设置请求体的长度
			httpURLConnection.setRequestProperty("Content-Length",
					String.valueOf(data.length));
			// 获得输出流,向服务器写入数据
			OutputStream outputStream = httpURLConnection.getOutputStream();
			outputStream.write(data);

			int response = httpURLConnection.getResponseCode(); // 获得服务器的响应码
			if (response == HttpURLConnection.HTTP_OK) {
				InputStream inptStream = httpURLConnection.getInputStream();
				return getResponseResult(inptStream);
			}
		} catch (IOException e) {
			Log.d(TAG, "网络请求连接超时!");
			return null;
		}
		return null;
	}
/**
	 * 封裝請求,請求的參數使用&進行隔開,服務端通過截取&進行解析 例如:請求參數 ("userid",1)
	 * ("username","admin")-->轉換後的格式爲:userid=1&username=admin
	 * 如果是其他非英文字符則會自動轉換成UTF-8的格式編碼
	 * 
	 * @param params
	 *            請求的參數,鍵/值對應
	 * @param encode
	 *            請求編碼
	 * @return
	 */
	private static StringBuffer getRequestData(Map<String, String> params,
			String encode) {
		StringBuffer stringBuffer = new StringBuffer(); // 存储封装好的请求体信息
		try {
			for (Map.Entry<String, String> entry : params.entrySet()) {
				stringBuffer.append(entry.getKey()).append("=")
						.append(URLEncoder.encode(entry.getValue(), encode))
						.append("&");
			}
			stringBuffer.deleteCharAt(stringBuffer.length() - 1); // 删除最后的一个"&"
		} catch (Exception e) {
			e.printStackTrace();
		}
		return stringBuffer;
	}
里面请求的参数自键-值对应的,是用map或者其它
gao_chun 2014-10-31
  • 打赏
  • 举报
回复
1.可以考虑使用fastjson.jar ,直接将json序列化一下就行了!我觉得应该是序列化后访问服务器的时候格式存在问题 2.400错误,由于语法格式有误,服务器无法理解此请求,也就是客户端请求有问题
哎,真难 2014-10-31
  • 打赏
  • 举报
回复
400不是服务器那边的错误么,,,
  • 打赏
  • 举报
回复
引用 5 楼 sirius93 的回复:
估计是没加请求头,你用了StringEntity还得告诉服务器这是JSON格式而不是普通String httpPost.setHeader("Content-Type", "application/json");
哈哈哈哈哈,多谢啦,按照你的办法搞定了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧