[JAVA VC] 短網址生成,HTTP請求,隨想
最近比較流行短網址,所謂短網址,就是通過演算法把長網址轉換成短字元,然後對映到短網址伺服器快取或資料庫裡。當訪問短網址的時候自動從資料庫裡取出對映的原網址。
這樣一來短網址的好處就凸顯出來,第一是短小好記,一次對映後就永久固定不變;
第二就是釋出微博/說說/狀態的時候有字數限制,如果需要釋出一個網址就會佔據一半以上的字元量,轉換成短網址可以剩餘更多字元。或者在文章/貼吧/等等需要防遮蔽或不希望網址太長的地方,使用短網址只需要新增一點額外字元就可以了;
第三因為通過了對映伺服器,所以可以檢視通過此短網址訪問原網址的PV,UV等資訊,達到統計的目的。一般是在短網址後加特定字元就可以進入後臺管理,例如126.am的‘+’,goo.gl的'qz'(貌似是這個?) //據說是網際網路上最穩定、最安全和最快速的網址縮短服務。谷歌的大牛 ( ̄︶ ̄)。
By the way,貌似淘寶客這種東西的操作模式有點像,通過後臺對映一個自己的淘寶客連結,類似的可以檢視淘寶客連結的成交資訊,從而給淘寶客分成盈利。至於各種美麗說,蘑菇街,返利網神馬的,都是大淘寶客,搭建自己的平臺,掛滿淘寶客連結,他賺十元返你一元你還高興得很,說明賣家賺的更多,可以推測這個東西成本價不知道多低,質量不曉得好差。。。所以淘寶就是個坑!天坑!遠離淘寶,珍愛生命!咳咳。。扯遠了。。雖然我也用淘寶,再打個廣告——我的淘寶店鋪,非淘寶客連結喲親~ ~~~~~ http://rrurl.cn/l7Izvh
盈所以快去搶注短網址吧~支援自定義~這個很爽誒~定義自己名字生日XXXXXX那啥的~~~~
短網址演算法:
其實短網址的演算法跟我們倒沒啥關係,因為沒有伺服器搭建算出來也沒用,而且最重要的是這種簽名拉~校驗拉~演算法拉~Hash拉~數學拉什麼的。。。正常人是絕對不會感興趣的。。。。。簡而言之,就是通過MD5演算法生成簽名,然後劃分為4段,再進行位運算,再進行字母表索引得到特定字元,最後會生成4個6位字串,取其中任意一個作為當前短網址。至於重複的問題,首先這個演算法算出來以後重複概率應該不高?(咳咳,其實我也不知道高不高,不過每位有26+26+10應該是重複概率很低咯),如果遇到重複的就取另外的字串嘛,反正先到先得,先對映了的就不用管了。
短網址介面:
騰訊: url.cn
網易:126.am
新浪: t.cn
人人: rrurl.cn
百度:dwz.cn
第一家提供短網址服務的公司: tinyurl.cn
一般短網址介面的使用方法都是POST引數到伺服器,然後伺服器返回資訊。不過找了下貌似很多都沒有開放介面,有的網站開放了介面但是引數裡必須要求有使用者登陸啊,使用者授權神馬的。所以還是萌萌的度娘好,完全免費呼叫,引數乾淨明朗。而且度娘之前就搞過短網址服務不過由於域名實在太長,被稱為網址最長的短網址服務。所以後來悄悄收購了dwz.cn的域名重新低調上線,真是難為度娘了。度娘不哭~~站起來X。
1、生成短網址
請求:向dwz.cn/create.php傳送post請求,傳送資料包括url=長網址
返回:json格式的資料
1、status!=0 出錯,檢視err_msg獲得錯誤資訊(UTF-8編碼)
2、成功,返回生成的短網址 tinyurl欄位 2、自定義短網址
請求:向dwz.cn/create.php傳送post請求,傳送資料包括url=長網址&alias=自定義網址
返回:json格式的資料
1、Status!=0 出錯,檢視err_msg獲得錯誤資訊(UTF-8編碼)
2、成功,返回生成的短網址 tinyurl欄位
HTTP請求:
一般短網址介面的使用方法都是POST引數到伺服器,然後伺服器返回資訊。不過找了下貌似很多都沒有開放介面,有的網站開放了介面請求引數要求使用者的授權或登陸。客戶端(可以是瀏覽器,其他應用程式)與伺服器進行互動,必須要傳送請求,這裡用的是HTTP協議。常用的一般是GET請求和POST請求,簡單來說兩種請求方式基本相同,都是提交資料到伺服器。區別在於GET方法是通過URL來提交資料,伺服器從收到的URL裡解析資料,這樣做從安全形度來講要低一些,而且不能提交大量的資料。POST方法是通過加密的表單方式傳送,所以資料量可以比較大且安全。像QQ空間,人人的訪問應該就是傳送的GET請求,從URL欄就可以直觀看到相應的引數如帳號,當前目錄是相簿還是日誌等等,而密碼註冊一類的都是POST請求。
就實際程式碼來看,java的請求比較簡單,一些指令碼語言也應該比較簡單。java裡使用封裝好的URL,URLCONNECTION可以輕鬆請求到資料。而VC就特別的麻煩(而且類種類繁多,引數繁多,步驟繁多,總而言之也是個天坑!)。
1、通過CInternetSession建立會話
2、準備好各引數,資料包頭部,裡面包含協議方式,接收編碼,請求方式等等
3、通過CHttpConnection建立連線
4、通過CHttpFile建立讀寫檔案pfile
5、 使用pfile來OpenRequest,SendRequest
6、讀取返回資料,關閉連線
VC是天坑。。。。。還可以用其他API,WINHTTP包,TCP/IP。。。。不過每種都很複雜麻煩而且攪在一堆
JAVA 在網路方面確實很方便:
/*****************************
* 逸雨清風出品
* 淘寶店鋪名:逸雨清風書屋,出售電子書,程式設計,解決電腦問題
* 新浪微博:仁壽府府尹
* CSDN:http://blog.csdn.net/xyydyyqf
* DATE: 2013-6-1
* 祝我兒童節快樂!
******************************/
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.security.acl.Owner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class dwz extends JFrame implements ActionListener
{
private static char[] shortdwz = new char[100];
private static char[] line2;
private static String line;
private static char[] suitable;
private JPanel panel;
private JButton btncreat,btnclear,btncopy;
private JLabel lbllong,lblshort,lblcopy,lblmyshort,lblhelp;
private JTextField txtlong;
private JTextField txtshort;
private JTextField txtmyshort;
public dwz()
{
super("短網址生成器");
panel = new JPanel();
lbllong = new JLabel("原網址");
lblshort = new JLabel(" 短網址");
lblcopy = new JLabel("等待複製");
lblmyshort = new JLabel("自定義 http://dwz.cn/");
lblhelp = new JLabel("字母,數字,破折號");
txtlong = new JTextField(30);
txtshort = new JTextField(22);
txtmyshort = new JTextField(14);txtmyshort.setText("");
txtlong.setHorizontalAlignment(SwingConstants.LEFT);
txtshort.setHorizontalAlignment(SwingConstants.LEFT); //左對齊
btncreat = new JButton("生成");
btnclear = new JButton("清空");
btncopy = new JButton("複製網址");
panel.add(lbllong);panel.add(txtlong);
panel.add(lblmyshort);panel.add(txtmyshort);panel.add(lblhelp);
panel.add(lblshort);panel.add(txtshort);panel.add(btncopy);
panel.add(btncreat);panel.add(btnclear);panel.add(lblcopy);
txtlong.addKeyListener(new KeyEnterLisener());
txtmyshort.addKeyListener(new KeyEnterLisener());
btncreat.addActionListener(this);
btnclear.addActionListener(this);
btncopy.addActionListener(this);
this.add(panel);
this.setSize(400,165);
this.setLocationRelativeTo(null);
this.setResizable(false);
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source == btncreat)
{
if (txtmyshort.getText().equals(""))
txtshort.setText(Getdwz(txtlong.getText()));
else txtshort.setText(GetMydwz(txtlong.getText(),txtmyshort.getText()));
}
if (source == btnclear)
{
txtshort.setText("");
txtlong.setText("");
txtmyshort.setText("");
lblcopy.setText("等待複製");
line = null; line2 = null;
}
if (source == btncopy)
{
Clipboard clipboard = getToolkit().getSystemClipboard(); //獲得系統剪下板
StringSelection stringSelection = new StringSelection(txtshort.getText());
clipboard.setContents(stringSelection,null);
lblcopy.setText("複製成功");
}
}
public class KeyEnterLisener extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
if (txtmyshort.getText().equals(""))
txtshort.setText(Getdwz(txtlong.getText()));
else txtshort.setText(GetMydwz(txtlong.getText(),txtmyshort.getText()));
}
}
public static String Getdwz(String longwz)
{
try {
String strurl = "url="+longwz;
URL url = new URL("http://dwz.cn/create.php"); //偉大的度娘,無需使用者登陸授權就可直接呼叫API
//URL url = new URL("http://126.am/api!shorten.action"); 網易的API必須另外要使用者的key做引數,其他門戶沒有找到公開的API
URLConnection connection = url.openConnection(); //開啟url連線
connection.setDoOutput(true); //設定為輸出
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.write(strurl); //寫入短網址到PORT請求
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = in.readLine())!= null) //得到返回的資訊
{
line2 = line.toCharArray();
}
for (int i=0;i<line2.length;i++)
if (line2[i] == 'h')
{
int k=i,j;
for (j=0;line2[k]!='"';j++)
{
if (line2[k] != '\\') shortdwz[j] = line2[k];
else j--;
k++;
}
suitable = new char[j];
for (int temp=0;temp<j;temp++)
suitable[temp] = shortdwz[temp];
System.out.println(suitable);
break;
}
} catch (Exception e) {
System.out.println("傳送POST請求出現異常!" + e);
e.printStackTrace();
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
JOptionPane.showMessageDialog(null,"原網址輸入錯誤或無效!","錯誤",JOptionPane.ERROR_MESSAGE);
return null;
}
line =new String(suitable);
return line;
}
public static String GetMydwz(String longwz,String myshort)
{
try {
String strmyurl = "url="+longwz+"&alias="+myshort;
URL url = new URL("http://dwz.cn/create.php"); //偉大的度娘,無需使用者登陸授權就可直接呼叫API
URLConnection connection = url.openConnection(); //開啟url連線
connection.setDoOutput(true); //設定為輸出
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.write(strmyurl); //寫入短網址到PORT請求
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = in.readLine())!= null) //得到返回的資訊
{
line2 = line.toCharArray();
}
for (int i=0;i<line2.length;i++)
if (line2[2] == 's' && line2[3] == 't' && line2[4] == 'a' && line2[5] == 't')
{
JOptionPane.showMessageDialog(null,"哦豁,運氣撇,被人捷足先登了\n這個短網址已經被定義過了或不合法,","哦豁",JOptionPane.ERROR_MESSAGE);
return null;
}
else if (line2[2] == 'e' && line2[3] == 'r' && line2[4] == 'r')
{
JOptionPane.showMessageDialog(null,"哦豁,運氣撇,被人捷足先登了\n這個長網址已經對映其他短網址了,","哦豁",JOptionPane.ERROR_MESSAGE);
return null;
}
else if (line2[i] == 'h' )
{
int k=i,j;
for (j=0;line2[k]!='"';j++)
{
if (line2[k] != '\\') shortdwz[j] = line2[k];
else j--;
k++;
}
shortdwz[j] = '\0';
break;
}
} catch (Exception e) {
e.printStackTrace();
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
JOptionPane.showMessageDialog(null,"原網址輸入錯誤或無效!","錯誤",JOptionPane.ERROR_MESSAGE);
return null;
}
line =new String(shortdwz);
return line;
}
public static void main(String[] args) throws Exception
{
new dwz().setVisible(true);
}
}
VS10一如既往的天坑,尤其是呼叫系統API的時候:
//VC傳送POST請求的時候始終有異常,暫未處理
/*****************************
* 逸雨清風出品
* 淘寶店鋪名:逸雨清風書屋,出售電子書,程式設計,解決電腦問題
* 新浪微博:仁壽府府尹
* CSDN:http://blog.csdn.net/xyydyyqf
* DATE: 2013-6-2
******************************/
#include "stdafx.h"
#include "dwz.h"
#include "afx.h"
#include <afxinet.h>
BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
BOOL Main_OnInitDialog(HWND hWnd,HWND hWndFocus,LPARAM lParam);
void Main_OnCommand(HWND hWnd,int id,HWND hwndCtl,UINT codeNotify);
void Main_OnClose(HWND hWnd);
char* Getdwz(CString longwz);
char* Getmydwz(CString longwz,CString myshortwz);
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAINDIALOG),NULL,Main_Proc);
return 0;
}
BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
//開始訊息測試
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
//結束訊息測試
}
return FALSE;
}
BOOL Main_OnInitDialog(HWND hWnd,HWND hwndFocus,LPARAM lParam)
{
//設定應用程式圖示
HICON hIcon = LoadIcon((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDI_ICON3));
SendMessage(hWnd,WM_SETICON,TRUE,(LPARAM)hIcon);
SendMessage(hWnd,WM_SETICON,FALSE,(LPARAM)hIcon);
//新增初始化程式碼
return TRUE;
}
//主視窗關閉
void Main_OnClose(HWND hWnd)
{
EndDialog(hWnd,0);
}
//主視窗命令響應
void Main_OnCommand(HWND hWnd,int id,HWND hwndCtl,UINT codeNotify)
{
switch(id)
{
case IDCREAT:
char *longwz,*myshortwz,*shortwz;
ZeroMemory(longwz,sizeof(longwz));
ZeroMemory(myshortwz,sizeof(myshortwz));
ZeroMemory(shortwz,sizeof(shortwz));
GetDlgItemText(hWnd,IDC_LONG,longwz,sizeof(longwz));
GetDlgItemText(hWnd,IDC_MYSHORT,myshortwz,sizeof(myshortwz));
if (myshortwz == NULL) shortwz = Getdwz(longwz);
else shortwz = Getmydwz(longwz,myshortwz);
SetDlgItemText(hWnd,IDC_SHORT,shortwz);
break;
case IDCLEAR:
SetDlgItemText(hWnd,IDC_SHORT,"");
SetDlgItemText(hWnd,IDC_LONG,"");
SetDlgItemText(hWnd,IDC_MYSHORT,"");
break;
case IDCOPY:
char* source;
GetDlgItemText(hWnd,IDC_SHORT,source,sizeof(source));
if(OpenClipboard(NULL))
{
/*HGLOBLA clipbuffer;
char *buffer;
EmptyClipboard();
clipbuffer=GlobalAlloc(GMEM_DDESHARE,source.GetLength()+1);
buffer=(char *)GlobalLock(clipbuffer);
strcpy(buffer,LPCSTR(source));
GlobalUnLock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();*/
}
break;
default:break;
}
}
char* Getdwz(CString longwz)
{
char chHeader[128];
char chData[128];
char tChars[128];
memset(tChars,0,128);
CInternetSession session;
CHttpConnection* pConnection=NULL;
CHttpFile* pFile=NULL;
INTERNET_PORT nPort=8080;
strcpy(chHeader,"Content-Type: application/x-www-form-urlencoded");
strcpy(chData,"url=");
strcat(chData,longwz);
pConnection = session.GetHttpConnection("http://dwz.cn",nPort);
pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/create.php");
pFile->SendRequest(chHeader,(DWORD)strlen(chHeader),(LPVOID *)chData,strlen(chData));
pFile->Read(tChars,128);
session.Close();
char* shortdwz;
ZeroMemory(shortdwz,sizeof(shortdwz));
for (int i=0;i<sizeof(tChars);i++)
if (tChars[i] == 'h')
{
int k=i,j;
for (j=0;tChars[k]!='"';j++)
{
if (tChars[k] != '\\') shortdwz[j] = tChars[k];
else j--;
k++;
}
shortdwz[j] = '\0';
break;
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
MessageBox(NULL,"原網址輸入錯誤或無效!","錯誤",MB_ICONINFORMATION|MB_OK);
return NULL;
}
return shortdwz;
}
char* Getmydwz(CString longwz,CString myshortwz)
{
char chHeader[128];
char chData[128];
char tChars[128];
memset(tChars,0,128);
CInternetSession session;
CHttpConnection* pConnection=NULL;
CHttpFile* pFile=NULL;
INTERNET_PORT nPort=8080;
strcpy(chHeader,"Content-Type: application/x-www-form-urlencoded");
strcpy(chData,"url=");
strcat(chData,longwz);
strcat(chData,"&alias=");
strcat(chData,myshortwz);
pConnection = session.GetHttpConnection("http://dwz.cn",nPort);
pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,"/create.php");
pFile->SendRequest(chHeader,(DWORD)strlen(chHeader),(LPVOID *)chData,strlen(chData));
pFile->Read(tChars,128);
session.Close();
char* shortdwz;
ZeroMemory(shortdwz,sizeof(shortdwz));
for (int i=0;i<sizeof(tChars);i++)
if (tChars[2] == 's' && tChars[3] == 't' && tChars[4] == 'a' && tChars[5] == 't')
{
MessageBox(NULL,"哦豁,運氣撇,被人捷足先登了\n這個短網址已經被定義過了或不合法,","哦豁",MB_ICONINFORMATION|MB_OK;
return NULL;
}
else if (tChars[2] == 'e' && tChars[3] == 'r' && tChars[4] == 'r')
{
MessageBox(NULL,"哦豁,運氣撇,被人捷足先登了\n這個長網址已經對映其他短網址了,","哦豁",MB_ICONINFORMATION|MB_OK);
return NULL;
}
else if (tChars[i] == 'h')
{
int k=i,j;
for (j=0;tChars[k]!='"';j++)
{
if (tChars[k] != '\\') shortdwz[j] = tChars[k];
else j--;
k++;
}
shortdwz[j] = '\0';
break;
}
if (shortdwz[7]!='d' || shortdwz[8]!='w' || shortdwz[9]!='z')
{
MessageBox(NULL,"原網址輸入錯誤或無效!","錯誤",MB_ICONINFORMATION|MB_OK);
return NULL;
}
return shortdwz;
}
傲嬌的偽生日自定義地址:http://dwz.cn/19930622 //java原始碼與JVM下可執行JAR
隨想
|| 發神:
about mobile QQ2013:手機QQ最新版叫罵一片,不過除了罵點讓人不爽意外,有兩個功能倒確實挺牛叉的。像是檔案傳輸,多客戶端互傳檔案,這是要多牛叉的協議才能做到,手機上可能還要針對不同的機型,不曉得有沒得抽象出來的包。還有一個功能就是聊天資訊同步。當手機登陸伺服器的時候,自動掃描當前線上的客戶端,而且這些客戶端的聊天資訊都是同步到伺服器上的,再由伺服器統一下發比如最近一小時的記錄到所有客戶端。說明騰訊的伺服器機制很牛叉,不曉得又是好多根頭髮好多杯咖啡泡出來的,真是企鵝中的戰鬥雞。(不過這也同樣說明聊天要河蟹
- - 騰訊把我們看得赤裸裸的,就連傳個線上檔案說不定他都有擷取一份)
遊戲外掛:說到外掛,不得不提易語言這種神奇的東西,這種傳說中的東東貌似專門為外掛做後臺,盜號,木馬,病毒神馬的都少不了它~~~一般外掛就是對指定程式的資料,記憶體進行操作。捕獲了當前的程式,對它進行一些原本沒有的操作。像找茬遊戲外掛神馬的,捕獲它的程式,獲取到遊戲裡的兩幅影像,再根據圖形演算法,將圖片劃分為N塊畫素塊,用各點畫素值的和計算每塊畫素塊的值,再比較兩張圖片不同的畫素塊,當差別超過預設的誤差範圍,則可以判定當前畫素塊不同,通過寫操作繪圖對使用者做出提示。至於N的值和預設的誤差值是多少要看具體情況修改。像連連看這種估計也差不多,可能要用到Windows鉤子,還要進行滑鼠模擬操作。
網路協議:一般百度的時候URL裡就有wd=“搜尋的值“,應該就是GET請求的資料直接通過URL傳送,然後百度伺服器進行響應返回這個頁面。其他很多地方的網址都有這樣的效果,或是XML的解析。騰訊用的是UDP的協議,所以有離線的功能咪。
雲:好流行啊好流行,都在做雲,不管是搞儲存的還是搞安全的,不過為毛感覺就是以前的伺服器,換了個馬甲就爬出來裝新造勢咪。不過這些網站真心好有錢就是了,隨隨便便一個使用者就是免費送10個G,●﹏●
,雖然我不用。。。雲來雲去還不是要用網速下,就是伺服器網盤嘛,慢得很。
自動回覆指令碼:這個好啊!其實我超想搞這個的,像是現在的微博,人人,小黃雞,貼吧都是這種指令碼。人人的應該是專門註冊一個帳號,然後關注了很多公共主頁,然後搭建一個個人電腦伺服器,當伺服器電腦開啟的時候,上傳到伺服器上的指令碼就開始工作,用監聽的方式注意所有主頁,一旦有主頁有訊息更新就回復內容搶沙發,至於回覆的內容還可以隨機值/呼叫其他介面/固定值/圈人。至於微博就是那些打廣告的,自動掃描所有使用者,類似一個爬蟲指令碼吧,蔓延在整個微博,設定好了關注的關鍵字,像是"減肥、痘痘、淘寶"什麼的,就自動給該使用者留言打廣告,廣告內容根據抓取的該使用者關鍵字而不同。貼吧應該也差不多,不過要解決驗證碼的問題。小黃雞應該是有一個資料庫,呃。。。腫麼讓我想起了清華大學的機器人小圖,跟小黃雞應該是差不多的吧,屬於自然語言處理。通過演算法分析使用者輸入的語句語境,然後收集使用者回覆的話加入到資料庫,當有相同類似的對話的時候就可以呼叫收集到的話了,很高階的樣子膩~還是多客戶端的膩親~~而且資料選擇多了還可以隨機選擇一種回覆使得回覆不那麼單調。
好吧
( ̄▽ ̄) 所謂隨想就是隨便想的,完全木有理論依據的,認真你就輸了,哦嚯嚯嚯。當隨筆記下來了,以後有實際想法的再去一一實踐驗證。
/*
******逸雨清風 出品
******http://blog.csdn.net/xyydyyqf
*/
相關文章
- http://t.cn短網址 新浪t.cn短網址是如何申請開通的HTTP
- 微信url短網址線上生成 最新微信短網址生成平臺推薦
- 微信短網址 微信短網址(url.cn)線上生成介面
- url.cn短網址 騰訊url.cn短網址生成介面
- URL短網址線上生成工具
- 騰訊短網址(url.cn短網址) 2020最新騰訊短網址生成api介面推薦API
- 微信短網址線上生成 推薦幾個可在線上生成微信短網址的平臺
- T.CN短網址 新浪T.CN短網址生成工具推薦
- 短網址生成API介面,短鏈生成 W外鏈API介面API
- 如何縮短淘寶客連結網址 淘客短網址線上生成教程
- W外鏈短網址生成,他們家的短網址免費的嗎?
- url.cn短網址 url.cn短網址網址縮短教程
- Java實現Http請求JavaHTTP
- java傳送http請求JavaHTTP
- HTTP網路請求原理HTTP
- JAVA設定http請求代理JavaHTTP
- 騰訊短連結url生成介面/騰訊短網址線上生成/新浪微博短連結生成器的分享
- http請求HTTP
- HTTP 請求HTTP
- 最新生成新浪短連結網址介面介紹
- java 偽造http請求ip地址JavaHTTP
- Java Http Get Post 請求工具類JavaHTTP
- Android Http請求框架二:xUtils 框架網路請求AndroidHTTP框架
- 影片生成SORA隨想Sora
- 網站http請求狀態碼網站HTTP
- 不限次數無廣告的短網址生成工具推薦
- mark java發起http請求的方式JavaHTTP
- java傳送http的get、post請求JavaHTTP
- http請求概述HTTP
- HTTP請求方法HTTP
- http請求頭HTTP
- go http請求GoHTTP
- 新浪短網址(t.cn/xxx)介面 最新新浪t.cn短網址線上生成平臺推薦
- 短網址連結生成器程式碼示例——新浪短連結api介面php、java、Python呼叫演示APIPHPJavaPython
- 短網址安全淺談
- Google短網址的APIGoAPI
- t.cn短連結 新浪t.cn短網址線上生成工具推薦
- W外鏈 短網址系統API 原始碼,網址縮短API介面API原始碼