предыдущий постМы суммируем 5 способов передачи данных по http/https для веб-разработки:
- url param
- query
- form urlencoded
- form data
- json
Эти 5 методов охватывают большинство сценариев в разработке, их освоение может легко удовлетворить потребности в различных передачах данных http/https.
Если вы хотите быть разработчиком полного стека, вы не можете быть удовлетворены написанием внешнего кода таким образом, вы должны также уметь писать внутренний код.
Итак, в этой статье давайте реализуем внешний и внутренний код, пройдем по всей ссылке и действительно освоим их.
Внешний интерфейс использует axios для отправки запросов, а внутренний использует Nest.js в качестве серверной среды.
Готов к работе
Прежде всего, нам нужно запустить сервер Nest.js и поддерживать API-интерфейс и статические страницы.
Nest.js очень быстро создает грубый сервис, для этого требуется всего несколько шагов:
- Чтобы установить @nest/cli, используйте
nest new xxx
Создайте проект Nest.js, - Выполнить в корневом каталоге
nest g resource person
Быстро сгенерировать грубый код для модуля человека -
npm run start
Запустите службу Nest.js
Такой сервис с хамским интерфейсом будет работать, не правда ли, быстро?
Так выглядит сервис после запуска
Он выводит доступные интерфейсы и может быть протестирован в почтальоне или браузере:
Интерфейс API работает, а затем поддерживает доступ к статическим ресурсам:
main.ts отвечает за запуск ioc-контейнера Nest.js.На основе кода, сгенерированного скаффолдом, вызов useStaticAssets может поддерживать запросы на статические ресурсы.
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
app.useStaticAssets(join(__dirname, '..', 'public'), { prefix: '/static'});
await app.listen(3000);
}
bootstrap();
Мы указываем префикс как статический, а затем добавляем html в общедоступный каталог статических файлов:
<html>
<body>hello</body>
</html>
Перезапустите службу, а затем откройте браузер, чтобы попробовать:
Поддерживается как API-интерфейс, так и доступ к статическим ресурсам.Далее давайте реализуем следующие 5 методов передачи данных по HTTP на интерфейсе и на сервере соответственно.
url param
Параметр url — это параметр в URL-адресе, который объявлен в Nest.js с помощью имени параметра, а затем извлечен декоратором @Param (имя параметра) и введен в контроллер:
@Controller('api/person')
export class PersonController {
@Get(':id')
urlParm(@Param('id') id: string) {
return `received: id=${id}`;
}
}
Интерфейсный код — это метод get, а параметры помещаются в URL-адрес:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>
<body>
<script>
async function urlParam() {
const res = await axios.get('/api/person/1');
console.log(res);
}
urlParam();
</script>
</body>
Запустите службу под доступом к браузеру:
Консоль выводит сообщение, возвращенное сервером, которое доказывает, что сервер получил данные, переданные параметром url.
Способ передачи данных через URL-адрес в дополнение к параметру URL-адреса и запросу:
query
query — это строка после ? в URL-адресе, которая должна быть закодирована.
В Nest.js получите его через декоратор @Query:
@Controller('api/person')
export class PersonController {
@Get('find')
query(@Query('name') name: string, @Query('age') age: number) {
return `received: name=${name},age=${age}`;
}
}
Интерфейсный код также отправляет запрос на получение через axios:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>
<body>
<script>
async function query() {
const res = await axios.get('/api/person/find', {
params: {
name: '光',
age: 20
}
});
console.log(res);
}
query();
</script>
</body>
</html>
Параметры задаются параметрами, axios будет кодировать URL, вам не нужно делать это самостоятельно.
Затем проверьте:
Сервер успешно принял данные, которые мы передали через запрос.
Приведенные выше два (параметр URL, запрос) — это способы передачи данных через URL-адрес, а следующие три — способы передачи данных через тело.
html urlencoded
html urlencoded передает данные через тело, на самом деле строка запроса помещается в тело, поэтому требуется url encode:
Если он получен Nest.js, используя декоратор @Body, Nest.js проанализирует тело запроса и вставит его в dto.
dto — это объект передачи данных, который используется для инкапсуляции передаваемых данных:
export class CreatePersonDto {
name: string;
age: number;
}
import { CreatePersonDto } from './dto/create-person.dto';
@Controller('api/person')
export class PersonController {
@Post()
body(@Body() createPersonDto: CreatePersonDto) {
return `received: ${JSON.stringify(createPersonDto)}`
}
}
Интерфейсный код использует метод post для запроса, указывая тип контента какapplication/x-www-form-urlencoded
, используйте qs для кодирования URL:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
<script src="https://unpkg.com/qs@6.10.2/dist/qs.js"></script>
</head>
<body>
<script>
async function formUrlEncoded() {
const res = await axios.post('/api/person', Qs.stringify({
name: '光',
age: 20
}), {
headers: { 'content-type': 'application/x-www-form-urlencoded' }
});
console.log(res);
}
formUrlEncoded();
</script>
</body>
</html>
Тестируется:
Сервер успешно получил данные.
На самом деле, для передачи чаще используется json, чем формат urlencoded:
json
json необходимо указать тип содержимого какapplication/json
, содержимое будет передаваться в формате JSON:
Внутренний код также использует @Body для получения, никаких изменений не требуется. И форма urlencoded, и json берут значение из тела, Nest.js различает его в зависимости от типа контента и использует разные методы синтаксического анализа.
@Controller('api/person')
export class PersonController {
@Post()
body(@Body() createPersonDto: CreatePersonDto) {
return `received: ${JSON.stringify(createPersonDto)}`
}
}
Интерфейсный код использует axios для отправки почтовых запросов, а передача json по умолчанию будет указывать тип контента какapplication/json
, не нужно вручную указывать:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>
<body>
<script>
async function json() {
const res = await axios.post('/api/person', {
name: '光',
age: 20
});
console.log(res);
}
json();
</script>
</body>
</html>
Тестируется:
Сервер успешно получил данные, переданные через json.
И json, и форма urlencoded не подходят для передачи файлов. Если вы хотите передать файлы, используйте данные формы:
form data
Данные формы используют -------- в качестве границы для разделения передаваемого контента:
Nest.js анализирует данные формы с помощью перехватчика FilesInterceptor, включенного с помощью декоратора @UseInterceptors и извлекаемого через @UploadedFiles. Содержимое нефайлов также извлекается через @Body.
import { AnyFilesInterceptor } from '@nestjs/platform-express';
import { CreatePersonDto } from './dto/create-person.dto';
@Controller('api/person')
export class PersonController {
@Post('file')
@UseInterceptors(AnyFilesInterceptor())
body2(@Body() createPersonDto: CreatePersonDto, @UploadedFiles() files: Array<Express.Multer.File>) {
console.log(files);
return `received: ${JSON.stringify(createPersonDto)}`
}
}
Интерфейсный код использует axios для отправки почтового запроса, указывая тип контента какmultipart/form-data
:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>
<body>
<input id="fileInput" type="file" multiple/>
<script>
const fileInput = document.querySelector('#fileInput');
async function formData() {
const data = new FormData();
data.set('name','光');
data.set('age', 20);
data.set('file1', fileInput.files[0]);
data.set('file2', fileInput.files[1]);
const res = await axios.post('/api/person/file', data, {
headers: { 'content-type': 'multipart/form-data' }
});
console.log(res);
}
fileInput.onchange = formData;
</script>
</body>
</html>
ввод файла Укажите несколько, чтобы выбрать несколько файлов.
Тестируется:
Сервер получает имя и возраст:
Перейдите в консоль сервера, чтобы увидеть:
Как видите, сервер успешно принял загруженный нами файл.
Весь код загружен на github:GitHub.com/кварк глюон P…
Суммировать
Мы используем axios для отправки запросов, используем Nest.js для запуска бэкенд-сервиса и реализуем 5 методов передачи данных http/https:
Первые два из них находятся в URL:
- url param: параметры в URL, используйте @Param в Nest.js для получения
- query: строка после ? в URL-адресе, который извлекается с помощью @Query в Nest.js.
Последние три находятся в теле:
-
form urlencoded: Аналогичен строке запроса, но помещается в тело. Nest.js использует @Body для выборки, а axios должен указать тип контента как
application/x-www-form-urlencoded
, а URL кодирует данные с помощью qs - json: данные в формате json. Nest.js использует @Body для выборки, и axios не нужно указывать тип контента отдельно, axios будет обрабатывать его внутри.
-
form data: Данные, разделенные ----- в качестве границы. В основном используемый для передачи файлов, Nest.js должен использовать FilesInterceptor для обработки, использовать @UseInterceptors для включения. Используйте @Body для остальных. В axios тип контента должен быть указан как
multipart/form-data
и инкапсулировать передаваемое содержимое с помощью объекта FormData.
Эти 5 методов передачи данных http/https охватывают большинство сценариев разработки.Если вы хотите перейти к полному стеку, предоставление этих 5 интерфейсов — это первое, что нужно сделать.