androidform提交
① android如何向網頁提交表單數據
在後台寫提交方法,然後通過js和後台交互的方法。網上很多介紹的
② 小白想請問form表單提交數據到釘釘,這個介面該怎麼寫 求詳細
一、免登問題
1.如何在App及後台獲取企業及用戶相關信息
(1)微應用主頁支持使用$CORPID$模板參數表示corpid,用戶訪問微應用的時候釘釘將把$CORPID$替換成用戶所屬企業的corpid,例如http://www.dingtalk.com/index?corpid=$CORPID$
(2)獲取用戶信息需要通過免登服務,詳情http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.Bz74m4#免登服務
2.釘釘微應用OAuth2授權打開一個應用時提示對不起您無許可權查看該頁面
可能的原因:
(1)如果其他應用正常,或者企業其他人打開應用沒問題,可能是緩存問題引起,請清除下緩存
(2)參數redirect_uri的值沒有做url編碼
(3)redirect_uri的域名和微應用的域名不一致
3.免登Code的時效性
免登授權碼是一次性的,團隊(未認證的企業)失效時間五分鍾
二、JSAPI問題
1.jsapi許可權校驗失敗,錯誤碼080003是什麼原因
請先按照文檔,先檢查參數agentid傳值是否正確,agentId查看方式:
(1)如果是isv應用,需要通過http://open.dingtalk.com/doc/#10-獲取企業的應用信息
(2)企業自建應用,通過oa後台查看http://open.dingtalk.com/doc/#開發環境准備
2.jsapi許可權校驗時返回{message:"許可權校驗失敗",errorcode:3}
(1)首先檢查用來生成簽名(signature)的jsapi_ticket是否過期(jsapi_ticket有效期為7200秒,而且當你請求了新的ticket之後,舊的ticket就失效了)
(2)其次檢查生成簽名的Url參數,與調用dd.config 所在的url是否一致
生成簽名用的url需要去除hash部分,e.g. 如果當前頁面url是http://abc.def/ghi/jkl?m=123&n=456#opq,則用於生成簽名的url是http://abc.def/ghi/jkl?m=123&n=456,可以使用調試工具來生成jsapi_ticket和signature,並和你實際使用的進行對比
(3)提示許可權校驗失敗,errorcode:3,錯誤碼52019,請檢查corpid是否正確
3.使用JSAPI返回簽名或者Ticket獲取失敗
JSAPI返回失敗主要有兩種錯誤
(1)[錯誤碼:52011] [jsapi ticket 讀取失敗]
a.確認agentId參數正確傳入
b.確認以傳入agentId對應的企業身份獲取過jsapi_ticket,也就是調用過get_jsapi_ticket方法
c.確認agentId對應的企業身份獲取的jsapi_ticket沒有過期.即在兩個小時的有效期之內
(2)[錯誤碼:52013][簽名校驗失敗]
a.確認agentId參數正確傳入
b.oa後台設置uri和許可權校驗uri不一致(去掉hash部分)
c.確認獲得的jsapi_ticket為最新的,沒有其他服務同時調用get_jsapi_ticket方法,導致生成簽名的jsapi_ticket過期
d.確認生成jsapi簽名正確,可以使用debug工具進行調試https://debug.dingtalk.com/
4.ios 單頁面應用更改url#後面的參數(如:localhost:8100/#/test1 變成 localhost:8100/#/test2),調用jsapi無效
ios單頁面應用更改url參數,導致調用jsapi無效問題,將在2.7版本隨新版本發布;
若是老版本(2.7以前版本),需要打開頁面時重新授權,調用jspai即可正常
5.jspai 調用返回errCode7 錯誤原因
(1)請查看在dd.config的jsApiList中,是否已配置要使用的jsapi,未配置的話會報錯
(2)ios 單頁面應用提示 errCode7 Jsapi Should NOT CallselectorString
同問題5,單頁面應用更改url參數,導致調用jsapi無效,老版本(2.7以前版本)需要重新授權,調用jsapi正常
(3)requestJsApis() not invoked,errorCode:7
dd.ready一定要在dd.config之後執行
6.如何獲取JSAPI許可權(需再詳細些)
可以參照http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.XpRuM1#客戶端開發文檔,要使用的jsapi必須進行許可權驗證配置,在dd.config中進行配置,可參照http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.XpRuM1#許可權驗證配置-beta
7.工具欄顏色如何設置
在頁面需要引入js文件的前提下,通過url參數設置導航欄顏色,參數名為dd_nav_bgcolor
比如微應用當前頁面鏈接為:https://abc.xyz/,要設置的顏色為FF112233(前兩位默認FF,後面6位112233是對應的色值),可設置頁面url為:https://abc.xyz/?dd_nav_bgcolor=FF112233
8.device.geolocation.get 提示unauthorized errcode 4
用戶設備禁用了手機的定位功能
9. 釘釘發送會話消息,cid如何獲取
使用場景示例:用戶在微應用中拉起本地聊天窗口列表(通過調用jsapi-獲取會話信息),選擇某一個聊天窗口,微應用將收到釘釘返回的cid,通過這個cid會送會話消息。
a.前提條件:jsapi可使用,即已經配置到dd.config,且通過jsapi的許可權校驗
b.通過jsapi獲取會話cid,詳見http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.FDtb0f#獲取會話信息
10.errorMessage:」err msg redirect_uri domain is not secure domain」,」errorCode」:」3」
在oa後台設置微應用首頁地址(域名設置為可信域名,即可安全訪問授權)
11.讀取nfc晶元介面無法使用
[font=微軟雅黑, 'Microsoft Yahei', 'Hiragino Sans GB', tahoma, arial, 宋體]目前nfc晶元介面只支持android(文檔中已註明,請查看文檔)
三、服務端API
1.調用管理通訊錄介面返回43004,無效的HTTP HEADER Content-Type如何解決
管理通訊錄的部分介面採用了POST請求,請求體使用JSON格式,請在HTTP請求頭中設置Content-Type:application/json
2.上傳文件不成功
使用multipart/form-data請求上傳文件,需要附加文件標示信息,參數名為media;java示例代碼為
HttpEntity requestEntity =MultipartEntityBuilder.create().addPart("media", new FileBody(file, ContentType.APPLICATION_OCTET_STREAM, file.getName())).build();
3.新建部門和員工信息為中文時,創建不成功
請檢查編碼格式,確認是utf-8編碼
4.注冊事件回調介面,每個corpid只能注冊一個回調url嗎
一個企業的一個套件,只能注冊一個回調url
5.返回系統繁忙錯誤
(1)調試調用介面過程中出現,請先確保是否是JSON格式錯誤,比如POST時有的JSON里缺少了這種括弧[ ]
(2)請檢查url是否正確,如免登介面,通過code換取用戶信息,/getuserinfo,實際應為/user/getuserinfo
(3)調用其他介面也返回系統繁忙,請您立刻在答疑群或論壇等反饋給釘釘人員
四、ISV接入問題
1.開發者平台創建套件校驗url有效性問題
如果返回字元串不匹配,提示錯誤代碼71009,可以通過以下常見問題確認具體原因:
a.可以通過將加密數據在本地解密下,看解密後的數據是否正確
b.查看是否是各欄位名字錯誤,如timeStamp,卻寫成了timestamp
2.ISV接入回調介面沒有suiteticket推送
注冊套件之後,釘釘伺服器會向填寫的回調介面推送suite_ticket;接收到推送之後需要返回加密後的字元串「success」,如果不返回或返回錯誤,釘釘伺服器將連續推送,直到推送次數超過100次,就不再推送;
此時需要進入開發者後台,進入套件管理頁面,點擊『重新推送』按鈕,即可重新推送
3.回調地址接收釘釘伺服器推送下來的數據,遇到計算解密文字錯誤
請查看加解密庫和demo下載第二個步驟,見http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.FDtb0f#加解密庫和demo下載
4.模擬測試企業發起授權所有套件,收不到臨時授權碼,而是change_auth
在開發者平台,目前授權行為只能發起一次,如已經收到臨時授權碼,模擬測試企業發起授權行為,收到change_auth事件;
測試企業解授權功能近期會上線,請關注文檔及論壇更新
5.不存在的臨時授權碼
臨時授權碼只能使用一次,使用後再次使用會提示「不存在的臨時授權碼」
6. isv開發中,如果permanentCode沒有存下來,如何獲取到
目前沒有辦法獲取,可以通過解除授權再次授權重新獲取,解除授權功能暫時未開放,請在文檔及論壇關注開放時間
7. 微應用性能測試提供的測試號碼加不進去
微應用性能測試提供的3個測試號碼,使用釘釘開放平台通訊錄介面添加的話,有最多加入5個非認證企業限制;建議通過釘釘管理後台(https://oa.dingtalk.com/#/login)的通訊錄進行添加
8.微應用性能測試報告中的圖像中,顯示無權查看該頁面可能原因
請將在測試的h5地址直接在釘釘會話中打開,如找一個聊天會話,把要測試的h5地址直接貼在會話中,並點擊打開
a.如果打開提示無權查看該頁面,則是h5地址問題;
b.如果打開正常,請聯系釘釘值班同學反饋;
10.IP白名單問題,返回errcode":60020",訪問ip不在白名單之中
調用釘釘API的機器需要配置在開發者平台中配置白名單
11.如何解除開發者平台的釘釘賬號綁定
暫未提供開發者平台、雲市場與釘釘賬號解綁功能,請關注官方文檔及論壇,若提供會同步更新
12.第三方ISV的套件開發完,如何與釘釘接入合作,讓其他企業授權使用套件
ISV開發完成套件後,需要對微應用進行性能評測等(http://open.dingtalk.com/doc/index.html?spm=a3140.7785475.0.0.rscFVO#微應用性能評測),以及在釘釘應用市場進行上架後,才可被其他企業用戶搜索到,並進行購買授權等操作;
可關注文檔對應用市場內容的更新,可發送郵件至郵件組[email protected]進行咨詢
13.isv如何獲取企業中用的mobile和email
如果在開發者後台勾選了郵箱欄位,則可以獲取用戶的email;mobile暫不提供
14.isv demo中返回創建套件時返回解密文字或corpid或者suiteKey不匹配
(1)在 ENV文件中
[font='Helvetica Neue', Helvetica, Arial, sans-serif]public static final String CREATE_SUITE_KEY = "suite4xxxxxxxxxxxxxxx";//首次創建套件校驗url時使用;
public static final String SUITE_KEY = "";//已有套件時使用
(2)IsvReceiveServlet中
dingTalkEncryptor = new DingTalkEncryptor(Env.TOKEN, Env.ENCODING_AES_KEY, Env.SUITE_KEY);
第三個參數使用,如果首次創建校驗url使用 Env.CREATE_SUITE_KEY,即
dingTalkEncryptor = new DingTalkEncryptor(Env.TOKEN, Env.ENCODING_AES_KEY, Env. CREATE_SUITE_KEY);
如果已有套件,使用Env.SUITE_KEY,且在ENV文件中將public static final String SUITE_KEY = "xxxx";賦值,即
dingTalkEncryptor = new DingTalkEncryptor(Env.TOKEN, Env.ENCODING_AES_KEY, Env.SUITE_KEY);
五、通用問題
1.isv接入demo
最近收到isv接入demo存在加解密失敗問題,這部分demo正在更新,近期會更新(http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.ai7Y3e#加解密庫和demo下載)
2.釘釘https下使用oss Js SDK請求ERRSSLPROTOCOLERROR
https://bbs.aliyun.com/read/275103.html?spm=0.0.0.0.L7U6vv
六、常見需求及建議回復
1.發Ding的介面是否支持
釘釘不對外提供提供服務端ding介面
2.釘釘是否開放公告介面
釘釘暫不開放公告介面
3.釘釘是否提供審批、簽到等微應用介面,便於第三方系統數據對接
目前只提供了管理日歷介面接入,詳見http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.ai7Y3e#管理日歷接入指南;
其他暫未提供
4.釘釘產品如何與企業內部的ERP系統實現對接
(1)可以基於釘釘開放平台開發一個報表的微應用,釘釘提供免登機制獲取用戶信息,報表許可權由你開發的微應用進行控制
(2)微應用是基於H5開發的,因此可以基於H5開發圖標展示
(3)企業內部的文件可以通過釘盤進行存儲,也可以存放在自己的伺服器,在微應用內進行下載
以上實現均需開發微應用
③ android客戶端如何提交表單數據給web伺服器
1.伺服器端的准備
為了完成該實例,我們需要在伺服器端做以下准備工作:
(1)我們需要在MyEclipse中創建一個Web工程,用來模擬伺服器端的Web服務,這里,我將該工程命名為了「myhttp」。
(2)修改該工程的「index.jsp」文件,添加兩個輸入框和一個提交按鈕,作為該Web工程的顯示頁面。運行Tomcat,在瀏覽器中訪問該Web工程,可以看到如圖1所示的界面。
Web工程的顯示頁面
(3)在該Web工程中,創建一個繼承自HttpServlet的LoginAction類,並實現其中的doPost()方法,用來響應圖1所示頁面的用戶操作。具體實現如下:
由上述代碼可以看出,當我們在圖1所示的頁面輸入用戶名「admin」,密碼「123」時,點擊提交按鈕,會得到「Login succeeded!」的提示信息,如圖2所示。若用戶名、密碼錯誤,則會得到「Login failed!」的提示信息。
2.客戶端實現
在Android客戶端,我們需要完成的工作是:以POST方式發送用戶名密碼到上述伺服器,並獲得伺服器的驗證信息。
我們分以下幾個步驟來完成。
2.1 UI界面
在Android工程中,我們需要完成一個簡單的UI界面,用來完成用戶名密碼的輸入、發送POST請求、顯示伺服器的驗證結果,完成後的界面如圖3所示。
在MainActivity中,我們需要獲取兩個EditText控制項的輸入,「提交」按鍵的監聽,以及伺服器驗證結果的TextView內容顯示。具體實現代碼如下:
2.2發送POST請求到伺服器
可以看到上述代碼中,我們調用了HttpUtils類的靜態方法submitPostData()完成了發送POST請求到伺服器,並將該方法的返回值(伺服器的響應結果)顯示在了TextView控制項中。
通過以上的代碼可以看出,在該方法中,其實完成了3件事:
(1)將用戶名密碼封裝成請求體,這是通過調用getRequestData()方法來實現的(後面會講到這個方法的具體實現)。
(2)設置HttpURLConnection對象的各種參數(其實是設置HTTP協議請求體的各項參數),然後通過httpURLConnection.getOutputStream()方法獲得伺服器輸出流outputStream,再使用outputStream.write()方法將請求體內容發送給伺服器。
(3)判斷伺服器的響應碼,通過httpURLConnection.getInputStream()方法獲得伺服器的響應輸入流,然後再調用dealResponseResult()方法處理伺服器的響應結果。
2.3封裝請求體
使用POST請求時,POST的參數不是放在URL字元串里,而是放在HTTP請求數據中,所以我們需要對POST的參數進行封裝。
針對該實例而言,我們發送的URL請求是:http://192.168.1.101:8080/myhttp/servlet/LoginAction,但是我們需要將POST的參數(也就是username和password)封裝到該請求中,形成如下的形式:
2.4處理響應結果
最後,我們再來看一看對伺服器返回結果的處理是怎樣的。因為在本實例中,伺服器的返回結果是字元串「Login succeeded!」或「Login failed!」,所以這里我們需要做的就是將伺服器的返回結果輸入流轉化成字元串。當然了,如果伺服器返回的是圖片,那麼,我們就需要就得到的輸入流轉化成Bitmap圖片了。如下代碼是上面代碼中用到的dealResponseResult()方法的具體實現。
2.5運行效果
④ 安卓界面的按鈕怎麼提交事件,例如我要提交到一個Java文件,實現注冊的功能,跟HTML里的表單提交類似
首先你這個是布局文件,按鈕你寫了onclick事件,這個時候你應該在Activity應用這個布局文件,再在那個Activity獲取你要的參數,然後直接調用你寫的驗證的java方法就OK了
⑤ android httpclient 怎麼提交訂單和訂單明細參數
package cn.itcast.net;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import cn.itcast.utils.StreamTool;
public class HttpRequest {
public static boolean sendXML(String path, String xml)throws Exception{
byte[] data = xml.getBytes();
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setDoOutput(true);//如果通過post提交數據,必須設置允許對外輸出數據
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
OutputStream outStream = conn.getOutputStream();
outStream.write(data);
outStream.flush();
outStream.close();
if(conn.getResponseCode()==200){
return true;
}
return false;
}
public static boolean sendGetRequest(String path, Map<String, String> params, String enc) throws Exception{
StringBuilder sb = new StringBuilder(path);
sb.append('?');
// ?method=save&title=435435435&timelength=89&
for(Map.Entry<String, String> entry : params.entrySet()){
sb.append(entry.getKey()).append('=')
.append(URLEncoder.encode(entry.getValue(), enc)).append('&');
}
sb.deleteCharAt(sb.length()-1);
URL url = new URL(sb.toString());
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
if(conn.getResponseCode()==200){
return true;
}
return false;
}
public static boolean sendPostRequest(String path, Map<String, String> params, String enc) throws Exception{
// title=dsfdsf&timelength=23&method=save
StringBuilder sb = new StringBuilder();
if(params!=null && !params.isEmpty()){
for(Map.Entry<String, String> entry : params.entrySet()){
sb.append(entry.getKey()).append('=')
.append(URLEncoder.encode(entry.getValue(), enc)).append('&');
}
sb.deleteCharAt(sb.length()-1);
}
byte[] entitydata = sb.toString().getBytes();//得到實體的二進制數據
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setDoOutput(true);//如果通過post提交數據,必須設置允許對外輸出數據
//Content-Type: application/x-www-form-urlencoded
//Content-Length: 38
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));
OutputStream outStream = conn.getOutputStream();
outStream.write(entitydata);
outStream.flush();
outStream.close();
if(conn.getResponseCode()==200){
return true;
}
return false;
}
//SSL HTTPS Cookie
public static boolean sendRequestFromHttpClient(String path, Map<String, String> params, String enc) throws Exception{
List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();
if(params!=null && !params.isEmpty()){
for(Map.Entry<String, String> entry : params.entrySet()){
paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
}
UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, enc);//得到經過編碼過後的實體數據
HttpPost post = new HttpPost(path); //form
post.setEntity(entitydata);
DefaultHttpClient client = new DefaultHttpClient(); //瀏覽器
HttpResponse response = client.execute(post);//執行請求
if(response.getStatusLine().getStatusCode()==200){
return true;
}
return false;
}
}
package cn.itcast.uploaddata;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import cn.itcast.net.HttpRequest;
import android.test.AndroidTestCase;
import android.util.Log;
public class HttpRequestTest extends AndroidTestCase {
private static final String TAG = "HttpRequestTest";
public void testSendXMLRequest() throws Throwable{
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><persons><person id=\"23\"><name>liming</name><age>30</age></person></persons>";
HttpRequest.sendXML("http://192.168.1.100:8080/videoweb/video/manage.do?method=getXML", xml);
}
public void testSendGetRequest() throws Throwable{
//?method=save&title=xxxx&timelength=90
Map<String, String> params = new HashMap<String, String>();
params.put("method", "save");
params.put("title", "liming");
params.put("timelength", "80");
HttpRequest.sendGetRequest("http://192.168.1.100:8080/videoweb/video/manage.do", params, "UTF-8");
}
public void testSendPostRequest() throws Throwable{
Map<String, String> params = new HashMap<String, String>();
params.put("method", "save");
params.put("title", "中國");
params.put("timelength", "80");
HttpRequest.sendPostRequest("http://192.168.1.100:8080/videoweb/video/manage.do", params, "UTF-8");
}
public void testSendRequestFromHttpClient() throws Throwable{
Map<String, String> params = new HashMap<String, String>();
params.put("method", "save");
params.put("title", "傳智播客");
params.put("timelength", "80");
boolean result = HttpRequest.sendRequestFromHttpClient("http://192.168.1.100:8080/videoweb/video/manage.do", params, "UTF-8");
Log.i("HttRequestTest", ""+ result);
}
}
伺服器端代碼:
package cn.itcast.action;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import cn.itcast.formbean.VideoForm;
import cn.itcast.utils.StreamTool;
public class VideoManageAction extends DispatchAction {
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
VideoForm formbean = (VideoForm)form;
if("GET".equals(request.getMethod())){
byte[] data = request.getParameter("title").getBytes("ISO-8859-1");
String title = new String(data, "UTF-8");
System.out.println("title:"+ title);
System.out.println("timelength:"+ formbean.getTimelength());
}else{
System.out.println("title:"+ formbean.getTitle());
System.out.println("timelength:"+ formbean.getTimelength());
}
//下面完成視頻文件的保存
if(formbean.getVideo()!=null && formbean.getVideo().getFileSize()>0){
String realpath = request.getSession().getServletContext().getRealPath("/video");
System.out.println(realpath);
File dir = new File(realpath);
if(!dir.exists()) dir.mkdirs();
File videoFile = new File(dir, formbean.getVideo().getFileName());
FileOutputStream outStream = new FileOutputStream(videoFile);
outStream.write(formbean.getVideo().getFileData());
outStream.close();
}
return mapping.findForward("result");
}
public ActionForward getXML(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
InputStream inStream = request.getInputStream();
byte[] data = StreamTool.readInputStream(inStream);
String xml = new String(data, "UTF-8");
System.out.println(xml);
return mapping.findForward("result");
}
}
⑥ 安卓開發 怎麼避免重復提交請求
web前端數據請求或者表單提交往往通過對dom的點擊事件來操作,但是往往因為認為點擊過快(少年手速挺快的嘛),或者因為響應等待使得用戶誤人為沒操作而重復很多次點擊,造成表單數據的連續重復提交,造成用戶體檢的不好,甚至影響到整個系統的安全性。而前端的防治重復提交至少很有效的防治了人為正常操作下的很多不必要麻煩。下面就來講講如何有效避免前端的表單重復提交 表單提交有以下幾種方式: <form name=」form」 method=」post」 action=」#"> <input type=」submit」 name=」submit」 value=」提交"> </form> 另外,還有一種常用的方法是使用圖片: 代碼如下: <form name=」form」 method=」post」 action=」# "> <input type=」image」 name=」submit」 src=」btnSubmit.jpg」> </form> 第三種是使用鏈接來提交表單,用到了javascript的DOM模型: 代碼如下: <form name=」form」 method=」post」 action=」#」> <a href=」javascript:form.submit();」>提交</a> </form> 實際上這一種是通過js 進行提交。可以理解成 $("form").find("a").click(function(){ $("form").submit(); }); 第一種和第二種可以用js來: $("input[type='submit']").click(function(){ $("form").submit(); }); $("input[name='submit']").click(function(){ $("form").submit(); }); 總之,都是對form進行提交,當然還有出了表單提交還有些請求也要防治重復,比如響應某個事件的ajax請求(提交數據) $.ajax({ url: url, type: "post", data: data, success: function (data) { callback; } }); 那麼前面這些提交和請求在網路和性能因素上導致不能及時網路響應並且在事件多次響應時造成的重復,除非在提交響應完成前的點擊(觸發事件)視為無效,等當前響應完了再去響應下一個請求 如果是表單按鈕我們可以這樣在點擊後將按鈕disabled掉 $("input[type='submit']").click(function(){ $(this).attr("disabled",true); $("form").submit(); }); 按道理來說,將點擊後將按鈕disabled設為true時按鈕就不能點擊了那麼第二次以後點擊就無效了,但這樣做你會發現同時第一次點擊的表單也無法正常提交了(好像是h5的標准後才不行的,無論怎樣h5標準的瀏覽器我試了試都不行),看來是disabled影響了表單的提交,那麼先提交後disabled看行不行 $("input[type='submit']").click(function(){ $("form").submit(); $(this).attr("disabled",true); }); 實驗結果 ,這樣也不行,我們不能猜想submit()回調在click函數最後執行並且.submit()函數內部應該對disabel做了判斷(假設這是瀏覽器內部機制原理),反正在當前這個交互周期里disabled了就不能submit 那麼我們可以拋開disabled用代碼邏輯來防治重復 $("input[type='submit']").click(function(){ if(!$(this)[0].repeat){ $(this)[0].repeat=true; $("form").submit(); } }); 在當前點擊的按鈕如果沒有repeat的話就進入提交並且設置個值為true的repeat屬性,當第二次進來的時候發現有這個屬性就不提交,看似這樣的邏輯會防治重復提交了,但是事實永遠都是殘酷的! 是的,當點擊過快的時候還是會重復提交,這是因為,如果click里沒執行submit的時候html默認的type=submit 的input點擊操作會提交表單,舉個完整的例子 <form name=」form」 method=」post」 action=」#"> <input type=」submit」 name=」submit」 value=」提交"> </form> <form name=」form」 method=」post」 action=」#"> <input type=」submit」 name=」submit」 value=」提交"> </form> $("input[type='submit']").click(function(){ console.log("here is click too!"); }); <form name=」form」 method=」post」 action=」#"> <div>提交</div> </form> $("form").find("div").click(function(){ $("form").submit(); }); 這三個代碼都是一個效果提交表單,但是!!!!!!!!!!我們發現阻止表單提交的不就是在當前交互周期(一次點擊-》響應-》回調)里,將submit按鈕disabled掉嗎,好的,少年上代碼 $("form").find("div").click(function(){ if(!$(this)[0].repeat){ $(this)[0].repeat=true; $(this).closest("form").submit(); }else{ $(this).attr("disabled",true); } }); 看到沒有,第二次點擊的時候就disabeld掉了,所以只有第一次成功,第二次的就不會提交了! 當然,如果是其他dom元素防治重復點擊那就更簡單了 $("div").click(function(){ if(!!$(this)[0].isRepeat){ return; } $(this)[0].isRepeat=1; $.ajax({ url: url, type: "post", data: data, success: function (data) { $(this)[0].isRepeat=0; callback; } }); }); 因為submit()會刷新試圖,而ajax不會,所以在回調後需要把判斷重復的那個屬性賦值為false 這是不是就更簡單?我想你會這樣認為的! 以上所述是小編給大家介紹的JS WEB 前端開發中防治重復提交的實現方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
⑦ android webview 有獲取到表單提交數據嗎
是可以獲取到的,可以通過java的對象,將數據傳遞到java裡面,回調取得值。
⑧ 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;
想了解根多信息請登錄http://www.xaafeicuie.com/