Flutter는 Rails API에 제대로 연결할 수 없습니다.

돌연변이 키보드

좋아, 여기 내 문제가 있습니다.

표준 Rails 5 API 만 설정되어 있습니다.

내 사용자 컨트롤러는 거의 표준입니다.

# frozen_string_literal: true

class UsersController < ApplicationController
  before_action :set_user, only: %i[show update destroy]

  # GET /users
  def index
    @users = User.all

    render json: @users
  end

  # GET /users/1
  def show
    render json: @user
  end

  # POST /users
  def create
    @user = User.new(user_params)


    if @user.save
      render json: @user, status: :created, location: @user
      UserNotifierMailer.send_signup_email(@user).deliver      
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /users/1
  def update
    if @user.update(user_params)
      render json: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  # DELETE /users/1
  def destroy
    @user.destroy
  end

  private

  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @user = User.find(params[:id])
  end

  # Only allow a trusted parameter "white list" through.
  def user_params
    params.require(:user).permit(:username, :password, :email)
  end
end

이제 Postman에서 서버에 데이터를 게시하면 완벽하게 작동하며 사용자를 정상적으로 등록합니다.

Postman에서 얻은 정보는 다음과 같습니다. 스크린 샷

반면에 저는 Flutter 애플리케이션을 사용하고 있으며 등록을 시도하고 있습니다.

다음은 Flutter 모델입니다.

import 'dart:convert';
import 'package:http/http.dart' as http;

class HeadUser {
  User _user;

  HeadUser({User user}) {
    this._user = user;
  }

  HeadUser.fromJson(Map<String, dynamic> json) {
    _user = json['user'] != null ? new User.fromJson(json['user']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this._user != null) {
      data['user'] = this._user.toJson();
    }
    return data;
  }
}

class User {
  String _username;
  String _email;
  String _password;
  int _id;
  DateTime _createdAt;
  DateTime _updatedAt;

  User({int id, DateTime createdAt, DateTime updatedAt, String username, String email, String password}) {
    this._username = username;
    this._email = email;
    this._password = password;
    this._id = id;
    this._createdAt = createdAt;
    this._updatedAt = updatedAt;
  }

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
    id: json['id'],
    username: json['username'],
    email: json['email'],
    createdAt: json['created_at'],
    updatedAt: json['updated_at'],
    );
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['username'] = this._username;
    data['email'] = this._email;
    data['password'] = this._password;
    return data;
  }
}

Future<HeadUser> loginUser(String url, {Map body}) async {
  return http.post(url, body: body).then((http.Response response) {
    final int statusCode = response.statusCode;
    if (statusCode < 200 || statusCode > 400 || statusCode == null) {
      throw new Exception("Error while posting data");
    }
    return HeadUser.fromJson(json.decode(response.body));
  });

}

그리고 이것에 대한 내 전화는 다음과 같습니다.

 onPressed: () async {
                          if (_formKey.currentState.validate())
                          {
                            HeadUser usr = new HeadUser(user: User(
                              email: this.emailEditingController.text.trim(),
                              password: this.passwordEditingController.text.trim(),
                              username: this.usernameEditingController.text.trim()
                            ));


                            HeadUser response = await loginUser(REGISTRATION_URL, body: usr.toJson());

하지만 그렇게하면 "user"매개 변수가 누락 된 것처럼 Flutter 애플리케이션에서 오류가 발생합니다. 인쇄 할 때 정확한 구조가 표시되지만이 오류가 발생합니다. 스크린 샷 2

이 경우 요청도 실행되지 않으므로 서버가 히트하지 않습니다.

내가하려고하지만 경우 json.encode(body)A의 loginUser방법, 다음 서버에서 내 대답은 다음과 같습니다

스크린 샷 3

물론 Flutter는 다음과 같이 불평합니다.

스크린 샷 4

내가 여기서 뭘 잘못하고 있니?

돌연변이 키보드

좋아, 실제로 문제 (및 해결책)를 찾았습니다.

이상한 이유 때문에 Rails는 데이터가 "Content-type": "application / json"으로 명시 적으로 게시되도록 요구합니다.

따라서 요청 헤더를 설정하고이를 http.post메서드에 전달해야합니다 .

Future<HeadUser> loginUser(String url, {Map body}) async {
  Map<String, String> headers = {"Content-type": "application/json"};
  return http.post(url, headers: headers, body: json.encode(body)).then((http.Response response) {
    final int statusCode = response.statusCode;
    if (statusCode < 200 || statusCode > 400 || statusCode == null) {
      throw new Exception("Error while posting data");
    }
    return HeadUser.fromJson(json.decode(response.body));
  });

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PhoneGap-서버에 제대로 연결할 수 없습니다.

분류에서Dev

OpenConnect는 VPN 전용 대상에 연결할 수 없습니다.

분류에서Dev

IoT는 MQTT + TLS로 서버에 연결할 수 없습니다.

분류에서Dev

Linux filezilla는 연결할 수 없지만 Windows에는 문제가 없습니다.

분류에서Dev

PhpMyAdmin으로 외부 서버에 제대로 연결할 수 없습니다.

분류에서Dev

Paho의 MQTT는 연결에 연결할 수 없습니다.

분류에서Dev

Windows VM의 열린 포트에 제대로 연결할 수 없습니다.

분류에서Dev

Rails 4-Rails 4의 데이터베이스에있는 테이블에 연결할 수 없습니다.

분류에서Dev

apt-cyg는 다운로드 미러에 연결할 수 없습니다

분류에서Dev

Dovecot으로 pop3 또는 imap에 연결할 수 없습니다.

분류에서Dev

Thunderbird 또는 K-9로 Exchange 서버에 연결할 수 없습니다.

분류에서Dev

Windows 10 용 Minecraft는 LAN의 로컬 서버에 연결할 수 없습니다.

분류에서Dev

SQL Server는 인터넷에서 원격으로 연결할 수 없습니다.

분류에서Dev

NetworkManager 또는 DHCPCD로 유선 네트워크에 연결할 수 없습니다.

분류에서Dev

JBoss는 때때로 데이터베이스에 연결할 수 없습니다.

분류에서Dev

VPN에 연결되어있는 동안 로컬 SQL Server에 연결할 수 없습니다.

분류에서Dev

rails sitemap_generator gem으로 모델에 연결할 수 없습니까?

분류에서Dev

Flutter Widget 테스트는 다른 화면 크기를 제대로 에뮬레이션 할 수 없습니다.

분류에서Dev

Rails 애플리케이션으로 sqlite3 데이터베이스에 연결할 수 없습니다.

분류에서Dev

Rails 4.2 : sidekiq이 Foreman으로 시작된 Redis (Errno :: ECONNREFUSED)에 연결할 수 없습니다.

분류에서Dev

kubernetes로 배포 할 때 gRPC에 연결할 수 없습니다.

분류에서Dev

아제로스 코어가있는 로컬 호스트 서버에 연결할 수 없습니다.

분류에서Dev

연결 해제 후 Wi-Fi에 다시 연결할 수 없습니다.

분류에서Dev

bucardo는 다른 DB에 연결할 수 없습니다

분류에서Dev

localhost에서 다른 localhost로 연결할 수 없습니다.

분류에서Dev

파일을 업로드하려는 대시 앱의 서버 오류에 연결할 수 없습니다.

분류에서Dev

QuickBlox WebRTC iOS : 제대로 연결할 수 없습니다.

분류에서Dev

SQLite는 Jar에서 DB에 연결할 수 없습니다.

분류에서Dev

"실제 Gmail.com에 연결할 수 없습니다."

Related 관련 기사

  1. 1

    PhoneGap-서버에 제대로 연결할 수 없습니다.

  2. 2

    OpenConnect는 VPN 전용 대상에 연결할 수 없습니다.

  3. 3

    IoT는 MQTT + TLS로 서버에 연결할 수 없습니다.

  4. 4

    Linux filezilla는 연결할 수 없지만 Windows에는 문제가 없습니다.

  5. 5

    PhpMyAdmin으로 외부 서버에 제대로 연결할 수 없습니다.

  6. 6

    Paho의 MQTT는 연결에 연결할 수 없습니다.

  7. 7

    Windows VM의 열린 포트에 제대로 연결할 수 없습니다.

  8. 8

    Rails 4-Rails 4의 데이터베이스에있는 테이블에 연결할 수 없습니다.

  9. 9

    apt-cyg는 다운로드 미러에 연결할 수 없습니다

  10. 10

    Dovecot으로 pop3 또는 imap에 연결할 수 없습니다.

  11. 11

    Thunderbird 또는 K-9로 Exchange 서버에 연결할 수 없습니다.

  12. 12

    Windows 10 용 Minecraft는 LAN의 로컬 서버에 연결할 수 없습니다.

  13. 13

    SQL Server는 인터넷에서 원격으로 연결할 수 없습니다.

  14. 14

    NetworkManager 또는 DHCPCD로 유선 네트워크에 연결할 수 없습니다.

  15. 15

    JBoss는 때때로 데이터베이스에 연결할 수 없습니다.

  16. 16

    VPN에 연결되어있는 동안 로컬 SQL Server에 연결할 수 없습니다.

  17. 17

    rails sitemap_generator gem으로 모델에 연결할 수 없습니까?

  18. 18

    Flutter Widget 테스트는 다른 화면 크기를 제대로 에뮬레이션 할 수 없습니다.

  19. 19

    Rails 애플리케이션으로 sqlite3 데이터베이스에 연결할 수 없습니다.

  20. 20

    Rails 4.2 : sidekiq이 Foreman으로 시작된 Redis (Errno :: ECONNREFUSED)에 연결할 수 없습니다.

  21. 21

    kubernetes로 배포 할 때 gRPC에 연결할 수 없습니다.

  22. 22

    아제로스 코어가있는 로컬 호스트 서버에 연결할 수 없습니다.

  23. 23

    연결 해제 후 Wi-Fi에 다시 연결할 수 없습니다.

  24. 24

    bucardo는 다른 DB에 연결할 수 없습니다

  25. 25

    localhost에서 다른 localhost로 연결할 수 없습니다.

  26. 26

    파일을 업로드하려는 대시 앱의 서버 오류에 연결할 수 없습니다.

  27. 27

    QuickBlox WebRTC iOS : 제대로 연결할 수 없습니다.

  28. 28

    SQLite는 Jar에서 DB에 연결할 수 없습니다.

  29. 29

    "실제 Gmail.com에 연결할 수 없습니다."

뜨겁다태그

보관