http相關(guān)知識(shí)

http相關(guān)知識(shí)

1.1絕對(duì)路徑-相對(duì)路徑

  1. 相對(duì)地址的定義:

     被鏈接文件相對(duì)于當(dāng)前頁面的地址。 只包含本地路徑的網(wǎng)頁地址偏瓤,地址通常以“/”和“../”表示層級(jí)關(guān)系。
    
  2. 絕對(duì)地址的定義:

     絕對(duì)地址就是文件在網(wǎng)絡(luò)或本地的絕對(duì)位置椰憋。絕對(duì)厅克,具有唯一性,如官網(wǎng)地址橙依。
     絕對(duì)地址是互聯(lián)網(wǎng)上的獨(dú)立地址证舟,在任何網(wǎng)站通過這個(gè)地址可以直接到達(dá)目標(biāo)網(wǎng)頁。包含主域名和目錄地址窗骑。
    
  3. http status code

    RSET API tutoral

    • 500 : 'Internal Server Error'
    • 403 : 'Forbidden'
    • 404 : 'Not Found'
    • 304 : 'Not Modified'
    • 200 : 'OK'
  4. http verbs

    http verb

    • get
    • post
    • delete
    • put
// respond with "Hello World!" on the homepage
app.get('/user:id', function (req, res) {
  res.send('Hello World!');
});

// accept POST request on the homepage
app.post('/user/create', function (req, res) {
  res.send('Got a POST request');
});

// accept PUT request at /user
app.put('/user/:id', function (req, res) {
  res.send('Got a PUT request at /user');
});

// accept DELETE request at /user
app.delete('/user/:id', function (req, res) {
  res.send('Got a DELETE request at /user');
});

更多node里的verbs實(shí)行女责,參見這里

req取參數(shù)的3種方法

expressjs里的請(qǐng)求參數(shù),4.x里只有3種

  • req.params
  • req.body
  • req.query

已經(jīng)廢棄的api

  • req.param(Deprecated. Use either req.params, req.body or req.query, as applicable.)

req.params

app.get('/user/:id', function(req, res){
  res.send('user ' + req.params.id);
});

俗點(diǎn):取帶冒號(hào)的參數(shù)

req.body

Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as body-parser and multer.

This example shows how to use body-parsing middleware to populate req.body.

var app = require('express')();
var bodyParser = require('body-parser');
var multer = require('multer');

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.post('/', function (req, res) {
  console.log(req.body);
  res.json(req.body);
})

可以肯定的一點(diǎn)是req.body一定是post請(qǐng)求创译,express里依賴的中間件必須有bodyParser抵知,不然req.body是沒有的。

詳細(xì)的說明在下面的3種post用法里。

req.query

query是querystring

說明req.query不一定是get

// GET /search?q=tobi+ferret
req.query.q
// => "tobi ferret"

// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order
// => "desc"

req.query.shoe.color
// => "blue"

req.query.shoe.type
// => "converse"

因?yàn)橛凶儜B(tài)的寫法

// POST /search?q=tobi+ferret
{a:1,b:2}
req.query.q
// => "tobi ferret"

post里看不的刷喜,用req.body取残制。

準(zhǔn)備工作

var app = express();
var multer  = require('multer')

// for raw data
app.use(function(req, res, next){
  if (req.is('text/*')) {
    req.text = '';
    req.setEncoding('utf8');
    req.on('data', function(chunk){ req.text += chunk });
    req.on('end', next);
  } else {
    next();
  }
});

app.use(multer({
    dest: './uploads/',
  rename: function (fieldname, filename) {
    return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
  }
}))

說明

  • express4之后上傳組件使用multer
  • express4之前是由req.text的,但不知道是什么原因在4里取消了掖疮。

3種不同類型的post

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res) {
  res.send('respond with a resource');
});

router.get('/:id', function(req, res) {
  res.send('respond with a resource' + request.params.id);
});

router.post('/post', function(req, res) {
  // res.send('respond with a resource');
    res.json(req.body);
});

router.post('/post/formdata', function(req, res) {
  // res.send('respond with a resource');
    console.log(req.body, req.files);
    console.log(req.files.pic.path);
    res.json(req.body);
});

router.post('/post/raw', function(req, res) {
  // res.send('respond with a resource');
    res.json(req.text);
});


module.exports = router;

Post with x-www-form-urlencoded

see post.html

    <script>
    $(function(){
        $.ajaxSetup({
          contentType: "application/x-www-form-urlencoded; charset=utf-8"
        });
        $.post("/users/post", { name: "i5a6", time: "2pm" },
           function(data){
             console.log(data);
           }, "json");
    });
    </script>

in routes/users.js

    router.post('/post', function(req, res) {
      // res.send('respond with a resource');
        res.json(req.body);
    });

Post with form-data

主要目的是為了上傳

npm install --save multer

Usage

var express = require('express')
var multer  = require('multer')

var app = express()
app.use(multer({ dest: './uploads/'}))

You can access the fields and files in the request object:

console.log(req.body)
console.log(req.files)

重要提示: Multer will not process any form which is not multipart/form-data

see more

[圖片上傳失敗...(image-6f00b2-1583413665688)]

Post with raw

To get the raw body content of a request with Content-Type: "text/plain" into req.rawBody you can do:

https://gist.github.com/tj/3750227

req.rawBody已經(jīng)被干掉了初茶,現(xiàn)在只能用req.text

下面是tj給出的代碼片段

var express = require('./')
var app = express();

app.use(function(req, res, next){
  if (req.is('text/*')) {
    req.text = '';
    req.setEncoding('utf8');
    req.on('data', function(chunk){ req.text += chunk });
    req.on('end', next);
  } else {
    next();
  }
});

app.post('/', function(req, res){
  res.send('got "' + req.text + '"');
});

app.listen(3000)

[圖片上傳失敗...(image-760dc1-1583413665688)]

命令行玩法

#! /bin/bash

echo -n "post common"
curl -d "a=1&b=2" http://127.0.0.1:3001/users/post

echo -n 'post formdata'
curl -F 'pic=@"img/post-common.png"' -F 'a=1' -F 'b=2'  http://127.0.0.1:3001/users/post/formdata

echo -n 'post raw json'

curl -d "{"a":"1","b":"2","c":{"a":"1","b":"2"}}" http://127.0.0.1:3001/users/post

如不清楚,請(qǐng) man curl.

supertest用法

稍后補(bǔ)上(柯織)

https://github.com/visionmedia/supertest

比較好的例子

https://github.com/expressjs/restful-router

node express upgrade

As part of the 3.x -> 4.x changes, the middleware for processing multipart/form-data request body data was removed from the bodyParser middleware, so it only parses application/x-www-form-urlencoded and application/json request body data.

If you want to use multipart/form-data as the request body, you need to use the multer middleware.

what is rest?

https://github.com/nodeonly/http-api-guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浊闪,一起剝皮案震驚了整個(gè)濱河市恼布,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搁宾,老刑警劉巖折汞,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異猛铅,居然都是意外死亡字支,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門奸忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕伪,“玉大人,你說我怎么就攤上這事栗菜∏反疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疙筹,是天一觀的道長富俄。 經(jīng)常有香客問我,道長而咆,這世上最難降的妖魔是什么霍比? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮暴备,結(jié)果婚禮上悠瞬,老公的妹妹穿的比我還像新娘。我一直安慰自己涯捻,他們只是感情好浅妆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著障癌,像睡著了一般凌外。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涛浙,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天康辑,我揣著相機(jī)與錄音摄欲,去河邊找鬼。 笑死疮薇,一個(gè)胖子當(dāng)著我的面吹牛蒿涎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惦辛,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仓手!你這毒婦竟也來了胖齐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤嗽冒,失蹤者是張志新(化名)和其女友劉穎呀伙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體添坊,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剿另,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贬蛙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雨女。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阳准,靈堂內(nèi)的尸體忽然破棺而出氛堕,到底是詐尸還是另有隱情,我是刑警寧澤野蝇,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布讼稚,位于F島的核電站,受9級(jí)特大地震影響绕沈,放射性物質(zhì)發(fā)生泄漏锐想。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一乍狐、第九天 我趴在偏房一處隱蔽的房頂上張望赠摇。 院中可真熱鬧,春花似錦澜躺、人聲如沸蝉稳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耘戚。三九已至,卻和暖如春操漠,著一層夾襖步出監(jiān)牢的瞬間饿这,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工长捧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人串结。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像舅列,于是被迫代替她去往敵國和親肌割。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容