如何从REST API中增加数据

时间:2018-04-23 12:01:31

标签: javascript ecmascript-6 axios

在我的React应用程序中,我正在使用REST API。我有多个返回特定对象的端点,例如一个人:

  • from functools import partial from kivy.app import App from kivy.lang import Builder from kivy.uix.button import Button from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout from kivy.uix.gridlayout import GridLayout from kivy.uix.textinput import TextInput from kivy.uix.tabbedpanel import TabbedPanel from kivy.uix.tabbedpanel import TabbedPanelItem import multiprocessing def worker(): print('calculator') x=2 while True: x*x class MyApp(App): # layout def build(self): layout = BoxLayout(orientation='vertical') tab=TabbedPanel(do_default_tab=False) self.tabitem1=TabbedPanelItem(text='tab1') self.tabitem2=TabbedPanelItem(text='tab1') self.tabitem3=TabbedPanelItem(text='tab1') tab.add_widget(self.tabitem1) tab.add_widget(self.tabitem2) tab.add_widget(self.tabitem3) layout.add_widget(tab) #load tab in other core cpu ? #self.tab1() p = multiprocessing.Process(target=self.tab1()) p.start() p2 = multiprocessing.Process(target=worker()) p2.start() return layout def tab1(self): layout1 = BoxLayout(orientation='vertical') btn = Button(text='btn1', font_size=24) btn.bind(on_press=partial(self.click_button)) layout1.add_widget(btn) btn2 = Button(text='btn2', font_size=24) btn2.bind(on_press=partial(self.click_button)) layout1.add_widget(btn2) self.tabitem1.add_widget(layout1) def click_button(self, btn): print(btn.text) if __name__ == "__main__": MyApp().run() :返回人员列表
  • /api/persons:返回特定人员
  • /api/persons/:id:返回汽车/api/cars/:id财产中的某人

在每种情况下,我都有一个代表一个人的对象,我现在发现需要为这些对象添加功能,例如我想添加一个owner函数来汇总名字和姓氏以及ID 以良好的OOP方式,我不想在任何需要显示名称的地方重复该代码。相反,我想将该函数添加到返回的对象。

是否有可接受的默认方式?就像让它知道要反序列化的类一样?或者我应该在获取数据后手动转换数据?

3 个答案:

答案 0 :(得分:2)

此原型方法可用于任何具有“firstName”和“lastName”属性的对象:

Object.prototype.displayName = function() {
    if(this.firstName && this.lastName)
    {
      return this.firstName + " " + this.lastName
    }
    return ""
}

用法:

var person = {
    firstName: "John",
    lastName: "Doe"
}

person.displayName() // "John Doe"

显然,如果您将Person定义为一个类,您也可以使用Person.prototype.displayName扩展它,而不是创建Object的原型。

答案 1 :(得分:1)

我将使用构造函数创建一个class Person,该构造函数接受从API接收的POJO(普通旧JavaScript对象)类型的参数并声明类方法。然后在HTTP响应处理程序上,您应该将对象映射到Person类的实例。

// declare the class
class Person {
  constructor(person) {
    this.name = person.name;
    this.age = person.age;
  }

  displayName() {
    return this.name;
  }
}

// convert the plain objects to instances of the Person class
const people = apiResponse.people.map(person => new Person(person));

答案 2 :(得分:1)

您可以简单地将一个具有必要原型的新对象分配给API调用中的接收对象。

var apiData = [{_id: 317, name: "John", lastname: "Doe"},
               {_id: 562, name: "Fred", lastname: "Lee"}],
    proto   = {displayName: function(){
                              var dn = `${this.name} ${this.lastname} ${this._id}`;
                              console.log(dn);
                              return dn;
                            }},
    data    = apiData.map(d => Object.assign(Object.create(proto),d));
data.forEach(d => d.displayName());