1. android HTTP Post請求錯誤400
你確定你的post方法調用的url沒問題嗎?參數的名稱和個數也沒問題嗎?
2. 安卓httppost上傳數據為什麼最後要讀一下
因為HttpPost請求是以流的形式發送的,如果不讀取輸入流,伺服器將無法收到客戶端發送的數據,也就無法完成請求。
3. android post請求和get請求的區別
Get請求與Post請求的區別
Get是向伺服器發索取數據的一種請求,而Post是向伺服器提交數據的一種請求
Get是獲取信息,而不是修改信息,類似資料庫查詢功能一樣,數據不會被修改
Get請求的參數會跟在url後進行傳遞,請求的數據會附在URL之後,以?分割URL和傳輸數據,參數之間以&相連,%XX中的XX為該符號以16進製表示的ASCII,如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字元串用BASE64加密。
Get傳輸的數據有大小限制,因為GET是通過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關系了,不同的瀏覽器對URL的長度的限制是不同的。
GET請求的數據會被瀏覽器緩存起來,用戶名和密碼將明文出現在URL上,其他人可以查到歷史瀏覽記錄,數據不太安全。在伺服器端,用Request.QueryString來獲取Get方式提交來的數據
Post請求則作為http消息的實際內容發送給web伺服器,數據放置在HTML Header內提交,Post沒有限制提交的數據。Post比Get安全,當數據是中文或者不敏感的數據,則用get,因為使用get,參數會顯示在地址,對於敏感數據和不是中文字元的數據,則用post
POST表示可能修改變伺服器上的資源的請求,在伺服器端,用Post方式提交的數據只能用Request.Form來獲取
4. androidpost添加到請求頭
首先需要在url中加特殊標記/協議, 如在onWebViewResource方法中攔截對應的請求,然後將要添加的請求頭,以get形式拼接到url末尾。
攔截器沒搞懂就先搞這個法子暫時先寫到請求裡面,不然api介面啥都用不了,其實也並不是特別麻煩,後續要改,不考慮使用攔截器的話,可能要使用到sqlite資料庫,emmmm,想想還是別這么干。
1,post + header
public void postTest(){
OkHttpClient client = new OkHttpClient();
//post請求
FormBody formBody = new FormBody.Builder()
.add("event_id","33")
.build();
Request request = new Request.Builder().url(DecryptionAddress+"app/event/accept").
addHeader("Token","伺服器獲取的token").post(formBody).build();
client.newCall(request).enqueue(new Callback() {
public void onFailure(Call call, IOException e) {
System.out.println(e.getMessage());
} public void onResponse(Call call, Response response) throws IOException {
if(response.code() >= 200 && response.code() < 300) {
String result = response.body().string();
System.out.println(result);
}
}
});
}
登錄後復制
2,get + header
5. android POST請求(https)遇到的問題
安卓項目開發第一階段完工,接下來是後台交互。當然,與後台交互第一步一般都是與注冊登錄介面打交道。
不說廢話了,進入正題···以下講的post請求,是跟https相關
1.將訪問路徑轉成URL :
URLurl =newURL(path);
2.通過URL獲取連接:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3.設置請求方式:
conn.setRequestMethod("POST");
4.設置請求超時時間:
conn.setConnectTimeout(5000);
5.設置請求頭信息:
conn.setRequestProperty("Content-type","application/json");
6.獲取輸出流,將數據寫給伺服器:
6.1 OutputStreamos = conn.getOutputStream();// 獲取輸出流
6.2 os.write(data.getBytes());// 將數據寫給伺服器
7.設置響應碼:
int code = conn.getResponseCode();
7.1 請求碼200,表明請求成功,獲取返回內容的輸入流:
InputStream is = conn.getInputStream();
Log.v("json","MESSAGE == > "+streamToString(is));
7.2 將輸入流轉換成字元串信息:
7.3 若返回值400,則是返回網路異常,做出響應的處理。
1、android.os.NetworkOnMainThreadException
原因:
android.os.NetworkOnMainThreadException是說不要在主線程中訪問網路,這個是android3.0版本開始就強製程序不能在主線程中訪問網路,要把訪問網路放在獨立的線程中。
解決方法:(方法一親測有效,另外兩種方法未測試,想了解的請 移步至此 ···尊重原文作者勞動成果)
1> 想要忽略這些強制策略問題的話,可以在onCreate()方法裡面加上
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
並在方法上加上@SuppressLint("NewApi"),重試,OK。
此時,又拋出另一個問題······(程序猿就是不斷的解決各種問題,淚奔~~)
2、javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path
解決方法:忽略證書問題()
以上是網路到的方法,畢竟我只是一個剛接觸android開發才兩個月的小菜鳥,原文比較亂,整理一番供查閱。 原文出處 (尊重原文作者勞動成果)
我是不斷成長的mouse ···
6. android OKhttp 非同步POST請求
可以採用okGo 開實現,
OkGo.<String>post(BASEURL + "/test/deviceInfo")
.upJson(jsonObject)
.execute(callback);
然後在
@Override
public void onSuccess(Response<String> response) {} 內進行處理
7. Android HTTPPOST請求報錯
應該是你的post里沒有參數
沒有封閉請求正文,即表單
所以伺服器沒有取到值
8. android中怎麼發送post請求
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/lblPostResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/butPost"
android:layout_centerHorizontal="true"
android:text="提交結果" />
<Button
android:id="@+id/butPost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="25dp"
android:text="提交測試" />
9. android中post請求怎麼傳輸內容
一、需要用到的場景
在jQuery中使用$.post()就可以方便的發起一個post請求,在android程序中有時也要從伺服器獲取一些數據,就也必須得使用post請求了。
二、需要用到的主要類
在android中使用post請求主要要用到的類是HttpPost、HttpResponse、EntityUtils
三、主要思路
1、創建HttpPost實例,設置需要請求伺服器的url。
2、為創建的HttpPost實例設置參數,參數設置時使用鍵值對的方式用到NameValuePair類。
3、發起post請求獲取返回實例HttpResponse
4、使用EntityUtils對返回值的實體進行處理(可以取得返回的字元串,也可以取得返回的byte數組)
代碼也比較簡單,注釋也加上了,就直接貼出來了
[java]
package com.justsy.url;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.os.Bundle;
public class HttpURLActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("start url...");
String url = "http://192.168.2.112:8080/JustsyApp/Applet";
// 第一步,創建HttpPost對象
HttpPost httpPost = new HttpPost(url);
// 設置HTTP POST請求參數必須用NameValuePair對象
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("action", "downloadAndroidApp"));
params.add(new BasicNameValuePair("packageId", "89dcb664-50a7-4bf2-aeed-49c08af6a58a"));
params.add(new BasicNameValuePair("uuid", "test_ok1"));
HttpResponse httpResponse = null;
try {
// 設置httpPost請求參數
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
httpResponse = new DefaultHttpClient().execute(httpPost);
//System.out.println(httpResponse.getStatusLine().getStatusCode());
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 第三步,使用getEntity方法活得返回結果
String result = EntityUtils.toString(httpResponse.getEntity());
System.out.println("result:" + result);
T.displayToast(HttpURLActivity.this, "result:" + result);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end url...");
setContentView(R.layout.main);
}
}
ADD:使用HttpURLConnection 進行post請求
[java]
String path = "http://192.168.2.115:8080/android-web-server/httpConnectServlet.do?PackageID=89dcb664-50a7-4bf2-aeed-49c08af6a58a";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000);
System.out.println(conn.getResponseCode());
============================================================================================================================
通過get和post方式向伺服器發送請求
首先說一下get和post的區別
get請求方式是將提交的參數拼接在url地址後面,例如http://www..com/index.jsp?num=23&jjj=888;
但是這種形式對於那種比較隱私的參數是不適合的,而且參數的大小也是有限制的,一般是1K左右吧,對於上傳文件
就不是很適合。
post請求方式是將參數放在消息體內將其發送到伺服器,所以對大小沒有限制,對於隱私的內容也比較合適。
如下Post請求
POST /LoginCheck HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://192.168.2.1/login.asp
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 192.168.2.1
Content-Length: 39
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: language=en
Username=admin&checkEn=0&Password=admin //參數位置
在android中用get方式向伺服器提交請求:
在android模擬器中訪問本機中的tomcat伺服器時,注意:不能寫localhost,因為模擬器是一個單獨的手機系統,所以要寫真是的IP地址。
否則無法訪問到伺服器。
//要訪問的伺服器地址,下面的代碼是要向伺服器提交用戶名和密碼,提交時中文先要經過URLEncoder編碼,因為模擬器默認的編碼格式是utf-8
//而tomcat內部默認的編碼格式是ISO8859-1,所以先將參數進行編碼,再向伺服器提交。
private String address = "http://192.168.2.101:80/server/loginServlet";
public boolean get(String username, String password) throws Exception {
username = URLEncoder.encode(username);// 中文數據需要經過URL編碼
password = URLEncoder.encode(password);
String params = "username=" + username + "&password=" + password;
//將參數拼接在URl地址後面
URL url = new URL(address + "?" + params);
//通過url地址打開連接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//設置超時時間
conn.setConnectTimeout(3000);
//設置請求方式
conn.setRequestMethod("GET");
//如果返回的狀態碼是200,則一切Ok,連接成功。
return conn.getResponseCode() == 200;
}
在android中通過post方式提交數據。
public boolean post(String username, String password) throws Exception {
username = URLEncoder.encode(username);// 中文數據需要經過URL編碼
password = URLEncoder.encode(password);
String params = "username=" + username + "&password=" + password;
byte[] data = params.getBytes();
URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
//這是請求方式為POST
conn.setRequestMethod("POST");
//設置post請求必要的請求頭
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 請求頭, 必須設置
conn.setRequestProperty("Content-Length", data.length + "");// 注意是位元組長度, 不是字元長度
conn.setDoOutput(true);// 准備寫出
conn.getOutputStream().write(data);// 寫出數據
return conn.getResponseCode() == 200;
}