简体   繁体   English

即使状态为 200,解析后 Json 为空

[英]Json Empty after parse even though status 200

I am trying to parse a JSON after doing a HTTP GET request for my flutter app, however when it is parsed, the body shows as empty, this is the parsing code我在为我的颤振应用程序执行 HTTP GET 请求后尝试解析 JSON,但是当它被解析时,正文显示为空,这是解析代码

urlHausParseBox() {
Future<_GoneSmishinState> fetchUrlResponse() async {
  String url = myController.text;
  final response = await http.post(
      Uri.parse("https://urlhaus-api.abuse.ch/v1/url/"),
      headers: <String, String>{
        'Accept': 'application/json',
      },
      body: (<String, String>{
        'url': url,
        'query_status': query_status,
        'url_status' : url_status,
        //'status' : status,
        //'urlStatus' : urlStatus,
      }));

After this I have a check for the 200 status, and when recieved will return this to use after the fact, I printed the fields 'query_status' and 'url_status' but they came up empty so I printed what I was returning here在此之后,我检查了 200 状态,当收到后将返回它以供使用,我打印了“query_status”和“url_status”字段,但它们为空,所以我打印了我在这里返回的内容

if (response.statusCode == 200) {
    print (_GoneSmishinState.fromJson(jsonDecode(response.body)));
    return _GoneSmishinState.fromJson(jsonDecode(response.body));

but all that is printed out is _GoneSmishinState#23f48(lifecycle state: created, no widget, not mounted) which is not what is supposed to be returned by the HTTP GET request但打印出来的只是 _GoneSmishinState#23f48(lifecycle state: created, no widget, notmounted) 这不是 HTTP GET 请求应该返回的

The rest of my code is below我的其余代码如下

    import 'dart:convert';
import 'package:validators/validators.dart';
import 'package:flutter/material.dart';
import 'package:sms/sms.dart';
import 'dart:io';
import 'dart:developer' as developer;
import 'package:http/http.dart' as http;
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

String url = "https://urlhaus-api.abuse.ch/v1/urls/recent/"; //address for URL file

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key:key);
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: "Gone Smishin'",
      home:  GoneSmishin(),
    );
  }
}

class GoneSmishin extends StatefulWidget {
  const GoneSmishin({Key? key}) : super(key: key);
  State<GoneSmishin> createState() {
    return _GoneSmishinState(url_status: '', query_status: '');
  }

}

class _GoneSmishinState extends State<GoneSmishin> {
  String message = "";
  String word = "";
  bool isOn = false;

  final myController = TextEditingController();

  @override
  void dispose() {
    myController.dispose();
    super.dispose();
  }

  _GoneSmishinState({
    required this.query_status,
    required this.url_status,
  });
  final String query_status;
  final String url_status;

  factory _GoneSmishinState.fromJson(Map<String, dynamic> json) {
    return _GoneSmishinState(
      query_status: json["query_status"],
      url_status: json["url_status"],
    );
  }

  urlHausParseBox() {
    Future<_GoneSmishinState> fetchUrlResponse() async {
      String url = myController.text;
      final response = await http.post(
          Uri.parse("https://urlhaus-api.abuse.ch/v1/url/"),
          headers: <String, String>{
            'Accept': 'application/json',
          },
          body: (<String, String>{
            'url': url,
            'query_status': query_status,
            'url_status' : url_status,
          }));



      if (response.statusCode == 200) {
        print (_GoneSmishinState.fromJson(jsonDecode(response.body)));
        return _GoneSmishinState.fromJson(jsonDecode(response.body));
      } else {
        throw Exception('Failed to load website');
      }
    }

    fetchUrlResponse();

    if (query_status == "ok" && url_status == "online") {
      const Text ('Found in URLHause Database - Probably Smishing');
      print("found");
    } else if (query_status == "ok" && url_status == "offline") {
      const Text ('Found in URLHaus, not online');
      print("found offline");
    } else {
      const Text ('Found Nothing');
      print("not found");
      print (query_status);
      print (url_status);
    }

  _pushInput() {

    Navigator.of(context).push(
        MaterialPageRoute<void>(
            builder: (context) {
              return Scaffold(
                  appBar: AppBar(
                      title: const Text ('Submit a Link')
                  ),
                  body: (
                      Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [


                            TextField (
                              controller: myController,
                              decoration: InputDecoration(
                                border: OutlineInputBorder(),
                                hintText: 'Enter your Link Text',
                                contentPadding: EdgeInsets.symmetric(
                                    vertical: 40, horizontal: 20),
                              ),
                            ),


                            ElevatedButton(
                                onPressed: () {
                                  urlHausParseBox();
                                },
                                child: const Text('Submit')
                            )
                          ]
                      )
                  ));
            }
        )
    );
  }

  @override

  var buttonText = 'OFF';
  String textHolder = "App is Off";


  changeTextON() {
    setState(() {
      textHolder = "App is ON";
    });
    isOn == true;
  }
  changeTextOFF() {
    setState(() {
      textHolder = "App is OFF";
    });
    isOn == false;
  }

  Widget build(BuildContext context) {
    final ButtonStyle outlineButtonStyle = OutlinedButton.styleFrom(
      primary: Colors.black87,
      minimumSize: Size(200, 130),
      padding: EdgeInsets.symmetric(horizontal: 200),
      shape: const RoundedRectangleBorder(
        borderRadius: BorderRadius.all(Radius.circular(300)),
      ),
    ).copyWith(
      side: MaterialStateProperty.resolveWith<BorderSide>(
            (Set<MaterialState> states) {
          return BorderSide(
            color: Theme.of(context).colorScheme.primary,
            width: 1,
          );
        },
      ),
    );

    return Scaffold(
      appBar: AppBar(
        title: const Text("Gone Smishin'"),
        actions: [
          IconButton(
              icon: const Icon(Icons.add_link),
              onPressed:  _pushInput,
              tooltip: 'Submit a Link'
          )
        ],
        backgroundColor: Colors.red,
      ),
      body: Column (
          children: [
            Container(
              padding: EdgeInsets.fromLTRB(50, 50, 50, 50),
              child: Text('$textHolder',
                  style: TextStyle(fontSize: 50)
              ),

            ),
            Container(
              //child: Text(result)
            ),
            TextButton(
                style: outlineButtonStyle,
                onPressed: () {
                  changeTextON();
                },

                child: Text('ON')
            ),
            TextButton(
              style: outlineButtonStyle,
              onPressed: () {
                changeTextOFF();
              },
              child: Text("OFF"),
            )
          ]
      ),
    );
  }
}

Change this:改变这个:

  _GoneSmishinState({
    required this.query_status,
    required this.url_status,
  });
  final String query_status;
  final String url_status;

  factory _GoneSmishinState.fromJson(Map<String, dynamic> json) {
    return _GoneSmishinState(
      query_status: json["query_status"],
      url_status: json["url_status"],
    );
  }

to this:对此:

  _GoneSmishinState();
  var queryStatus = '';
  var urlStatus = '';

and this:和这个:

  if (response.statusCode == 200) {
    print (_GoneSmishinState.fromJson(jsonDecode(response.body)));
    return _GoneSmishinState.fromJson(jsonDecode(response.body));
  }

to:至:

  if (response.statusCode == 200) {
    setState(() {
        final decoded = json.decode(response.body);
        queryStatus = decoded['query_status'];
        urlStatus = decoded['url_status'];
      }
    );
  }

And, finally, patch up any unused/misnamed variables.最后,修补任何未使用/命名错误的变量。 As an aside, it's difficult to read functions declared inside other functions.顺便说一句,很难阅读在其他函数中声明的函数。 Is fetchUrlResponse inside urlHausParseBox ? urlHausParseBox fetchUrlResponse吗? Move it outside.把它移到外面。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM