最初のリリース: 公開アカウント「Zhao Xiake」
序文
私は長年バックエンド開発に携わってきました。10,000 とは言わないまでも 1,000 以上のインターフェイスをフロントエンドに提供してきました。100 人ではないにしても 50 人のフロントエンド開発者と協力してきました。新卒から社会人まで幅広く働いており、10年以上の経験を持つベテランプログラマーとして、長江南部のかわいい女の子から東北部の屈強な男性まで、ほぼあらゆる種類の人々と出会ってきました。フロントエンドとの接続プロセスで問題が発生しました。つまり、バックエンド インターフェイスが提供されました。セルフテストも成功しましたが、フロントエンドはインターフェイスがブロックされていると言いました。確認に行ったところ、 , ほとんどの場合、ブロックされているのはインターフェイスではないことがわかりました。多くの場合、フロントエンドが使用する姿勢が間違っていました。たとえば、インターフェイスに明確に記述されたパラメータはパス上に配置されていましたが、フロントエンドがそれらをインターネットに渡し、インターフェイスがULR
明確にqueryString
記述されている 使用されるのはapplication/x-www-form-urlencoded
形式ですが、フロントエンドはapplication/json
形式を渡します。そこで、この記事では、一般的に使用されるフロントエンドとバックエンドのパラメータ データ形式をまとめます。フロントエンドおよびバックエンドの開発者が HTTP インターフェイス プロトコルのパラメータ受け渡し形式をよりよく理解できるようにします。
1. HTTP URL 経由でパラメータを渡す
このメソッドは、最も単純で最も一般的に使用されるパラメータの受け渡しメソッドです。通常、フロント エンドがバックエンドからデータを取得するために使用されます。URL を介したパラメータの受け渡しには 2 つのタイプがあります。1 つはパラメータをパス上に配置する方法で、もう 1 つはパラメータをパス上に配置する方法です。もう 1 つは、パラメータをパス上に置く方法ですURL
。パラメータはQueryString
上、つまりURL
後ろ?
に配置されます。
HTTPメッセージフォーマット
GET /user/1?userName=admin&arrays=a,b,c,d&ids=1&ids=2&ids=3&ids=4
予防:
- パス
/user/1
上では、パラメータがパス1
を介して渡されますが、一部のフロントエンドでは、このスタイルでパラメータを渡すと間違いが発生します。URL
RestFul
userName=admin
これは単純なQueryString
パラメータ転送であり、最も一般的であり、通常は間違えることはありません。arrays=a,b,c,d
QueryString
これは、実際には分離を使用する配列を渡すことによって行われます,
。ids=1&ids=2&ids=3&ids=4
これは配列パラメータを渡す方法でもありますが、一般に使用頻度は低く、エラーが発生しやすいです。
バックエンドインターフェースコード
フレームワークを使用してSpringMVC
インターフェイスを作成し、2 つのアノテーションを介して上記のパラメーターを受け取ることができます@PathVariable
。@RequestParam
主な方法は 3 つあります。
- 1 つ目は、メソッドでパラメーターを 1 つずつ受け取ることです。
- 2 つ目は、
Map<String,Object>
受信を使用してパラメータを渡すことです。 - 3 番目の方法は、
UserDTO
オブジェクトをカプセル化して受信する方法です。
@GetMapping("/user/{id}")
public UserDTO request(@PathVariable Long id, String userName, String[] arrays,@RequestParam List<Long> ids) {
return UserDTO.builder().id(id).build();
}
@GetMapping("/user2/{id}")
public Map<String,Object> user2(@PathVariable Long id,@RequestParam Map<String,Object> map) {
return map;
}
@GetMapping("/user3/{id}")
public UserDTO user3(@PathVariable Long id, UserDTO user) {
return user;
}
@Data
public class UserDTO {
private Long id;
private String userName;
private String[] arrays;
private List<Long> ids;
}
予防:
- 配列パラメータを受け取るときは2 つのデータ型
String[]
を使用できます。List<Long>
Map<String,Object> map
受け取ったパラメータを使用する場合のValue
型はObject
type であり、追加する必要があります@RequestParam
- オブジェクトを使用して
User
パラメータを受け取る場合は、@RequestParam
注釈を追加しないでください
フロントエンド呼び出しインターフェイスのコード
このパラメーター受け渡し方法では、フロントエンドはすべてのパラメーターを直接結合URL上
できます。
var request = new XMLHttpRequest();
request.open('GET', 'http://localhost/user/1?userName=admin&arrays=a,b,c,d&ids=1&ids=2&ids=3&ids=4', true);
request.responseType = 'json';
request.onload = function () {
var data = this.response;
console.log(data);
};
request.send();
予防:
- 渡されたパラメータが
URL
安全でない場合は、次のことを行う必要があります。URLEncode
POST
、、PUT
メソッドはパラメータの受け渡しDELETE
もサポートしていますURL
。- この
URL
スプライシングを使用するブラウザごとにサポートされるパラメータの最大長は異なります。ブラウザごとにサポートされるパラメータの最大長は次のとおりです:
ブラウザ | URLの長さ制限 |
---|---|
インターネットエクスプローラ | 2048バイト |
360 スピードブラウザ | 65536バイト |
Firefox(ブラウザ) | 2118バイト |
Safari(ブラウザ) | 80000バイト |
Opera(ブラウザ) | 190000バイト |
グーグルクローム) | 8182バイト |
2. HTTP ボディを通じてパラメータを渡す
パラメーターの受け渡しは、データの追加、データの変更、ファイルのアップロードなど、HTTP Body
サーバーにデータを送信するために主にフロントエンドによって使用されます。パラメーターの受け渡しで一般的に使用される主なデータ形式は 3 つあります。Body
application/x-www-form-urlencoded
つまり、フォーム送信body
ではメッセージ内のkey=value
スプライシング パラメータが使用されます。application/json
データをJSON
フォーマットに変換して入力しますBody
。multipart/form-data
ファイルのアップロードに使用されます。
HTTPメッセージフォーマット
application/x-www-form-urlencoded
メッセージのフォーマット:
POST /user3/1
Content-Type: application/x-www-form-urlencoded
userName=admin&arrays=a,b,c,d&ids=1&ids=2&ids=3&ids=4
application/json
メッセージのフォーマット:
GET /user4/1
Content-Type: application/json
{
"id": 1,
"userName": "admin",
"arrays": [
"a",
"b",
"c",
"d"
],
"ids": [
1,
2,
3,
4
]
}
予防:
GET
メソッドはBody
パラメータを渡すこともできます。GET メソッドはパラメータを渡せないと思っている人が多いですが、GET メソッドはBody
渡すことしかできません。application/json
これを使用したことがある場合は、データを検索するときにデータがメソッドelasticsearch
を介して渡されることを知っているはずです。GET
JSON
バックエンドインターフェースコード
フレームワークで受け取られる型パラメータは、渡されるパラメータと共通であり、受け取りにはSpringMvc
アノテーションが必要です。Body
application/x-www-form-urlencoded
URL
QueryString
application/json
@RequestBody
@RequestMapping("/user3/{id}")
public UserDTO user3(@PathVariable Long id, UserDTO user) {
return user;
}
@RequestMapping("/user4/{id}")
public UserDTO user4(@PathVariable Long id,@RequestBody UserDTO user) {
return user;
}
@RequestMapping("/user5/{id}")
public UserDTO user4(@PathVariable Long id,@RequestBody String user) {
return JSONUtil.toBean(user,UserDTO.class);
}
予防:
@RequestBody
アノテーションを直接使用して受信することも、アノテーションを使用して受信して手動で変換するDTO
こともできます。この方法は、受信するデータにどのようなフィールドがあるかわからない場合に非常に便利で、送信された完全なデータを印刷できます。相手。String
DTO
フロントエンド呼び出しインターフェイスのコード
function sendFormUrl() {
var request = new XMLHttpRequest();
request.open('POST', 'http://localhost/user3/1', true);
request.responseType = 'json';
request.onload = function () {
console.log(this.response);
};
var formData = new FormData();
formData.append('userName', "admin");
formData.append('arrays', "a,b,c,d");
formData.append('ids', "1");
formData.append('ids', "2");
formData.append('ids', "3");
formData.append('ids', "4");
request.send(formData);
}
function sendJson() {
var request = new XMLHttpRequest();
request.open('POST', 'http://localhost/user4/1', true);
request.responseType = 'json';
request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
request.onload = function () {
console.log(this.response);
};
var body = {
"userName": "admin",
"arrays": [
"a",
"b",
"c",
"d"
],
"ids": [
1,
2,
3,
4
]
}
request.send(JSON.stringify(body));
}
予防:
multipart/form-data
主にファイルのアップロードに使用されますが、私の別の記事「
1 つのデモでフロントエンドとバックエンドの大きなファイルの分割アップロード、再開可能なアップロード、インスタント アップロードを処理する」をパラメータ化できます。
ヘッダーを介してパラメータを渡す
パラメータの受け渡しは主に、一般的に使用される など、Header
いくつかの一般的なユーザー認証情報に使用されます。Authentication: Bearer
Cookie
HTTPメッセージフォーマット
GET /user7/1
Accept: application/json
userName : admin
Cookie: userName=admin;
arrays: a,b,c,d
ids:1
ids:2
ids:3
ids:4
予防
- SpringMVCを使用する場合、カスタムリクエストヘッダーが規格を満たしていない
java.lang.IllegalArgumentException: The HTTP header line [username : admin] does not conform to RFC 7230. The request has been rejected.
ためリクエストが拒否されてしまう場合がありますが、設定を追加することで解決できます。userName
RFC 7230
reject-illegal-header: off
application.yml
追加した:
server:
port: 80
tomcat:
reject-illegal-header: off
バックエンドインターフェースコード
Header
パラメータの取得は、request.getHeader(header)
順次または@CookieValue
次の方法で@RequestHeader
取得できます。
@RequestMapping("/user6/{id}")
public User user6(@PathVariable Long id, HttpServletRequest request) {
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
String header= headerNames.nextElement();
log.info("{}->{}",header,request.getHeader(header));
}
return User.builder().id(id).build();
}
@RequestMapping("/user7/{id}")
public User user7(@PathVariable Long id, @CookieValue String userName, @RequestHeader String[] arrays, @RequestHeader List<Long> ids) {
return User.builder().id(id).userName(userName).arrays(arrays).ids(ids).build();
}
フロントエンド呼び出しインターフェイスのコード
function sendHeader() {
var request = new XMLHttpRequest();
request.open('GET', 'http://localhost/user7/1', true);
request.responseType = 'json';
request.setRequestHeader("arrays","a,b,c,d");
request.setRequestHeader("ids","1");
request.setRequestHeader("ids","2");
request.setRequestHeader("ids","3");
request.setRequestHeader("ids","4");
request.onload = function () {
console.log(this.response);
};
request.send();
}
予防:
Cookie
ブラウザによって自動的に追加されるため、request.setRequestHeader("userName","admin")
追加する必要はありません
要約する
この記事では、フロントエンドとバックエンドで HTTP インターフェイス プロトコルを介してパラメータを渡す一般的な方法を要約し、HTTP プロトコル、バックエンド JAVA からの各パラメータのメッセージ形式、バックエンド取得方法、およびフロントエンド呼び出し方法を示します。コード、およびフロントエンド JS コード。もちろん、に基づくリアルタイム プッシュ プロトコルなどwebsocket
、より高度なパラメータ送信方法もいくつかあります。sse
HTTP