我对Web API很陌生。我观察到一些方法返回ActionResult
。这是为什么?回归不够,例如CustomerDto
代替吗?
返回ActionResult并不提供有关返回的实际对象的线索。我想念一下吗?
答案 0 :(得分:1)
设计Web API有多种方法。在您的情况下,您可以返回CustomerDto。根据文档(https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results),Web API控制器操作可以返回以下任何内容: - 无效 - HttpResponseMessage - IHttpActionResult - 其他一些类型
通过使用IHttpActionResult,您可以更好地控制Http Reponse代码。
答案 1 :(得分:1)
Web API是一个灵活的平台 - 您可以编写简单的API,它们总是只返回特定的结果类型(例如您的key : Emp1_1_1_Name, value Emp1_Name
key : Emp1_1_2_Name, value Emp1_Name
key : Emp1_2_1_Name, value Emp1_Name
key : Emp1_2_2_Name, value Emp1_Name
key : emp2_1_1_Name, value emp2_Name
key : emp2_1_2_Name, value emp2_Name
key : emp2_2_1_Name, value emp2_Name
key : emp2_2_2_Name, value emp2_Name
),或者您可以编写更复杂的API,它们真正关心HTTP语义并希望拥有更多地控制状态代码,其他HTTP标头等。
或者你的方法可能正在处理“资源”,这些资源具有更复杂的表示形式,这些表示形式不容易由C#中的单个 DTO类建模,因此您希望灵活多个可能的“返回”类型”。
如果你不想要那种控制水平,是的,你可以继续并只返回你的DTO类型。没有人(据我所知)强迫您使用CustomerDto
。
答案 2 :(得分:1)
在ASP.NET Core中,前MVC" Controller" -class和Web Api" ApiController" -class一起合并到一个" Controller" -class。 ActionResult方法,它是一个经典的MVC方法,在构建MVC应用程序时非常有用,其中也包含在合并中,这就是为什么 在构建Web Api时可以使用它。
答案 3 :(得分:1)
如果您注意到.net核心web api的预建项目,则并非所有函数都返回import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
public class FilterTextField
{
public static void main (String [] a) {
SwingUtilities.invokeLater (new Runnable () {
@Override public void run () {
createAndShowGUI ();
}
});
}
private static void createAndShowGUI () {
JFrame frame = new JFrame ("Test");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setContentPane (new MainPanel ());
frame.pack ();
frame.setLocationRelativeTo (null);
frame.setVisible (true);
}
}
class MainPanel extends JPanel
{
public MainPanel () {
super (new GridLayout (3, 1, 0, 20));
JTextField t1 = new JTextField (20);
JTextField t2 = new JTextField (20);
JTextField t3 = new JTextField (20);
((AbstractDocument) t1.getDocument ()).setDocumentFilter (new MyDocumentFilter (5));
((AbstractDocument) t2.getDocument ()).setDocumentFilter (new MyDocumentFilter (10, '!', '?'));
((AbstractDocument) t3.getDocument ()).setDocumentFilter (new MyDocumentFilter (15, new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}));
add (t1);
add (t2);
add (t3);
setBorder (new EmptyBorder (20, 20, 20, 20));
}
}
class MyDocumentFilter extends DocumentFilter
{
private char [] forbiddenCharacters;
private int maximumLength;
public MyDocumentFilter (int maximumLength, char ... forbiddenCharacters) {
this.maximumLength = maximumLength;
this.forbiddenCharacters = forbiddenCharacters;
}
@Override public void replace (FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
// Get the full text you would have after replacement
Document document = fb.getDocument ();
String fullText = new StringBuilder (document.getText (0, document.getLength ())).replace (offset, offset + length, text).toString ();
// Check your requirements ...
if (fullText.length () <= maximumLength) {
if (forbiddenCharacters != null) {
for (char c : forbiddenCharacters) if (fullText.indexOf (c) > -1) return;
}
// Replace method is called only if your requirements are met.
super.replace (fb, offset, length, text, attrs);
}
}
}
或ActionResult
。所以是的,你可以完全归还IActionResult
之类的东西。通过这种方式,您可以将对象作为json返回,状态代码为200.但是,假设您的操作正在接受某些输入,并且您并不总是确定是否存在有效输出。在这种情况下,只有在成功时才会返回状态代码200,如果用户发送了无效数据或任何其他状态代码,则需要返回400(badRequest)。这是处理http请求的标准方法。
因此,使用CustomerDto
,您可以使用IActionResult
或CustomerDto
返回return Json(customer)
个对象,也可以在运行时返回使用return Ok(customer)
陷入错误。