如何从URL获取状态代码

时间:2016-09-29 00:48:22

标签: javascript angularjs json cordova ionic-framework

您好我是javascript和AngularJS的新手。这是我从服务器获取.json的函数(服务器返回JSON):

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:fitsSystemWindows="true"
    >

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/main.collapsing"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:contentScrim="?colorPrimary"
        >

        <ImageView
            android:id="@+id/main.imageview.placeholder"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:scaleType="centerCrop"
            android:src="@drawable/material_flat"
            app:layout_collapseMode="parallax"
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:title=""
            app:layout_scrollFlags="scroll|enterAlways|snap"
            app:layout_collapseMode="pin"
            />
    </android.support.design.widget.CollapsingToolbarLayout>


    <FrameLayout
        android:id="@+id/main.framelayout.title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:background="?colorPrimary"
        android:orientation="vertical"
        app:layout_scrollFlags="scroll|enterAlways"
        >

        <LinearLayout
            android:id="@+id/main.linearlayout.title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="vertical"
            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:gravity="bottom|center"
                android:text="Information"
                android:textColor="@android:color/white"
                android:textSize="30sp"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="4dp"
                android:text="Tagline"
                android:textColor="@android:color/white"
                />

        </LinearLayout>
    </FrameLayout>
</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="yu.heetae.android.materialdesign.ScrollingActivity"
    tools:showIn="@layout/activity_scrolling">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/text_margin"
        android:text="@string/large_text"/>

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/fab_margin"
    app:layout_anchor="@id/main.framelayout.title"
    app:layout_anchorGravity="top|end"
    app:srcCompat="@android:drawable/ic_dialog_email"/>

我的问题是:这是从网络服务器获取数据的最佳方式 我不仅想知道响应是否成功,还要知道状态代码是否为200。

然后我想知道我是否真的想要返回错误(我想要显示带有文本的图像:&#34;无法与服务器连接。再次尝试和#34;)。但我使用Ionic制作应用程序(HTML5,CSS3和使用AngularJS的javascript)。那么...什么是返回错误的最佳方式,我希望用文本显示我在apache cordova中编程的图像。 谢谢!

1 个答案:

答案 0 :(得分:0)

根据AngularJS文档:

  

$ http服务是一个便利的核心Angular服务   与远程HTTP服务器的通信

来自$ http调用的响应对象具有以下属性:

数据 - {string | Object} - 使用转换函数转换的响应体。

状态 - {number} - 响应的HTTP状态代码。您可以使用它来根据不同的代码制定逻辑

statusText - {string} - 响应的HTTP状态文本。

在您的示例中,您已实现了Promise.protorype.then()函数,该函数允许您委托成功(第一个参数)和错误(第二个参数),以便在实现承诺后进一步处理($ http.get电话已经完成。)

这就是我根据你的例子做的事情:

function getProducts() {
    // Call the http get function
    return $http.get(url).then(

        //The request succeeded - 200 status code
        function(response) {
            products= response.data.result;
                return products;
        },

        //The request failed
        function(response) {

           // Here you can access the status property and the statusText
           console.log("Http Status: " + response.status + " Description: " +   response.statusText);

           // Return a false result
           return false;
});

我通常会使用像Angular-UI-Notification之类的库来清理它,我会像这样实现它:

//The success handler function
function handle_response_success(response) {
    // Do processing here based on the response then show a success notification
    Notification.success('Success notification');
};

// The error handler function
function handle_response_error(error) {
     Notification.error('Something went wrong with that request. More Info: ' + 'Http Status: ' + error.status + ' Description: ' +   error.statusText);
}

// Then finally bind it to your getProducts call

function getProducts() {

    // More elegant proto imho
    return $http({ method: 'GET',
        url: 'http://example.com'
     });
};

// More elegant way to handle this imho
getProducts.then(handle_response_success.bind(this), handle_response_error.bind(this);