解决  网络服务 Query

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
我花了一些时间与 教程使用ASP.NET Core创建Web API 根据建议 在上一个查询中. I'm now trying to generate a client to invoke CICS 网络服务 JSPG2 but I'我在编写我的API测试时遇到了麻烦。我怀疑我'm trying to approach the problem from the wrong end, and the tutorial's approach should be abandoned.

此图显示了我正在尝试实现的目标
 WebAPI.jpg


我有软件(Micro Focus)为我们的COBOL和Mainframe支持 VB.Net software that generates COBOL for 网络服务s and other functions。我们的软件已生成程序JSPG2,这是服务MyJSv中的一个操作,该操作由JSON消息IJSPG2调用,并以消息OJSPG2进行响应。我正在尝试开发上图中表示为Interface MyJSv-JSPG2的接口代码。我最终的计划是 我们的软件 to generate these interfaces from the CICS 网络服务 message definitions, but the current objective is to develop an interface manually so that I have a pattern to work from.

建议我遵循本教程。现在,我认为本教程向我展示了如何创建服务。我不想创建Web服务器,我想创建Web客户端。

如果我是对的,请指出相关的教程供我阅读。

如果我错了,并且本教程是正确的模式,那么我需要克服当前的问题,将正确的代码放入POST对象,并设置端点地址。
无论哪种方式,您的帮助都将不胜感激。罗伯特

如果我们继续本教程的方法:-
这是我要做的:-

我生成了一个名为MyJSv的API项目,并在其中创建了JSPG2的控制器。我在“模型”文件夹中开发了层次结构类IJSPG2.cs和OJSPG2.cs,以匹配从服务器(大型机)端开始的COBOL记录开始的消息。我添加并注册了数据库上下文。到现在为止还挺好。

现在,我进入了教程阶段Scaffold a Controller。就像我使用的教程一样"具有操作的API控制器, using Entity Framework",然后在选择的对话框中:-
模型类IJSPG2(MyJSv.Models)
数据上下文类:JSPG2Context(MyJSv.Models)

Visual Studio反应为错误:-
运行所选代码生成器时发生错误:
实体类型“ IJSPG2”需要定义主键。
如果您打算使用无密钥实体类型,请调用“ HasNoKey0”
讨论(最初发布到VB.NET社区上的.NET CORE论坛)使我意识到我应该使用"具有操作的API控制器"。这克服了错误,但让我想知道下一步该怎么做。

TodoItemsController(源自ControllerBase)中的本教程POST代码是使用API​​ Controller和Actions Using Entity Framework生成的,然后进行了稍微修改。
C#:
        // POST: api/TodoItems
        [HttpPost]
        public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
        {
            _context.TodoItems.Add(todoItem);
            await _context.SaveChangesAsync();

            //return CreatedAtAction("GetTodoItem", new { id = todoItem.Id }, todoItem);
            return CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem);
        }
The equivalent code within MyJSvController, also derived from ControllerBase but generated using 具有操作的API控制器, is
C#:
        // POST api/<JSPG2Controller>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }
这是完全不同的,所以我在这里写什么?它需要做的是将C#类IJSPG2转换为JSON,并将其发送到端点(http:// localhost:9003 / cics / services / JSPG2),并处理从JSON到OJSPG2的响应。我猜这就是
C#:
 return CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem);
确实可以,但是我一直在努力了解迄今为止在.NET CODE 3.1(这是教程的先决条件)之前找到的教程代码和网络资源,或者对我来说是无法理解的(我正在学习C#,在使用VB.NET和ASP.NET约15年后,Web API和.NET一次全部实现。
 

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
有人可以帮我吗?已经有一个多星期了,没有任何答复,我真的需要在这方面取得进展:与此同时,我正在用尽其他工作。

I have a test 网络服务 running at http:// localhost:9003 / cics / services / JSPG2 接受类IJSPG2描述的JSON输入并产生输出(类OJSPG2)。我想知道如何编写Windows或Web客户端程序
  1. 将类IJSPG2格式化为JSON,并将其发送到服务
  2. 接收JSON响应并将数据值放入OJSPG2类
有关此问题的详细信息以及到目前为止我已经尝试做的事情。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
It would help us help you is you showed us the classes IJSPG2 and OJSPG2, because, quite frankly, I tried going to your company's 网站 pages that you've linked in the past and can't seem to find a "developers guide"关于如何使用公司的产品/服务。

很抱歉,如果信息在视频中。我更喜欢阅读而不是观看视频。
 

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
It would help us help you is you showed us the classes IJSPG2 and OJSPG2, because, quite frankly, I tried going to your company's 网站 pages that you've linked in the past and can't seem to find a "developers guide"关于如何使用公司的产品/服务。

很抱歉,如果信息在视频中。我更喜欢阅读而不是观看视频。
跳伞运动员,感谢您的回复。

我不会以为您需要对我的软件有这么多的了解才能回答我的问题,因为上图显示了我正在尝试做的事情。请记住,程序JSPG2和消息IJSPG2和OJSPG2是一个特定的示例,而我的目标是为我提供一个示例,该示例可以从定义中生成,该客户端通过发布消息IJSPG2并处理OJSPG2的响应来调用JSPG2。程序JSPG2。我当前正在使用的类定义是通过.json布局手动准备的:这是SOAPUI Pro显示的输入,然后是输出。我将这些表示为C#类,大致就像我们在 上一个问题,您已回答。所有这些的要点是,许多数据规则未在.json中表达,但可以从程序规则中推断出来,例如"必须在查询后进行更新",对于我来说,在类的get和set属性中表达这些规则应该相对容易。如果您真的想了解更广泛的背景,我建议您注意 MANASYS和Micro Focus 从大约1分钟到大约30秒的时间,并了解这里显示的Jazz格式消息定义中暗含了我需要的所有规则(到达此位置时暂停)。明天,我将向您发送链接以获取更多信息,以避免需要观看视频(但仅需2分钟),但我现在必须走。感谢您的帮助。

输入
JSON:
{
   "JSPG2" : {
      "IJSPG2" : {
         "JZ_Function" : "E",
         "JZ_Employee_Skip" : 0,
         "JZ_Employee" : {
            "EMPNO" : "90",
            "FIRSTNME" : "",
            "MIDINIT" : "",
            "LASTNAME" : "",
            "WORKDEPT" : "",
            "PHONENO" : "",
            "HIREDATE" : "",
            "JOB" : "",
            "EDLEVEL" : "",
            "SEX" : "",
            "BIRTHDATE" : "",
            "SALARY" : "",
            "BONUS" : "",
            "COMM" : "",
            "JZ_CURRENCY" : "",
            "Checksum" : ""
         }
      }
   }
}

输出值
JSON:
{
   "JSPG2" : {
      "IJSPG2" : {
         "JZ_Function" : "E",
         "JZ_Employee_Skip" : 0,
         "JZ_Employee" : {
            "EMPNO" : "90",
            "FIRSTNME" : "",
            "MIDINIT" : "",
            "LASTNAME" : "",
            "WORKDEPT" : "",
            "PHONENO" : "",
            "HIREDATE" : "",
            "JOB" : "",
            "EDLEVEL" : "",
            "SEX" : "",
            "BIRTHDATE" : "",
            "SALARY" : "",
            "BONUS" : "",
            "COMM" : "",
            "JZ_CURRENCY" : "",
            "Checksum" : ""
         }
      }
   }
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我了解您正在尝试做的更广泛的背景。我正在寻找的是有关如何实际调用Web终结点的信息。但是我认为这让我望而却步,因为我现在已经准备好考虑使用REST-ful API。"web service"用来。我在脑海中跳过了几次提到WSDL的事实,而忽略了使用SOAPUI进行测试的简便性的说法……可能是因为我倾向于将SOAP视为使用XML而不是JSON。

无论如何,调用Web服务的方法是通过告诉Visual Studio您对服务的引用来为SOAP Web服务生成代理。您输入WSDL的URL,Visual Studio将为您生成一个代理类,您可以在其中设置IJSPG2的属性,调用方法并返回OJSPG2对象。您无需触摸任何JSON。它们都是C#对象。代理类负责对WSDL指定的数据进行编码和解码,并进行适当的HTTP POST。

如果您想跳过代理类,那么您将不得不探究如何使用原始HTTP进行SOAP调用。我一直在刷新该内存,因为我觉得它太复杂了,必须变得更简单。值得庆幸的是,RESTful Web服务应运而生。通常,您将不得不格式化您的消息正文,并用SOAP信封包装您想要的JSON有效负载,然后执行HTTP POST。您返回的响应也将响应包含在SOAP信封中。您将解析SOAP信封以获取有效载荷。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
这可能会或可能不会有帮助:
 

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
不要对软件产品的引用感到困惑"SOAPUI",我对SOAP调用不感兴趣。 SOAPUI是Smartbear的软件产品,是测试Web服务(SOAP或REST)的出色工具。产品名称反映了它的起源,当时SOAP是唯一可用的Web服务标准。现在,SOAPUI似乎强调了REST服务,这肯定是我正在使用的,但是它的工具可同时用于这两种类型。同样,在我的软件中"Web Service"是一个通过HTTP与另一个程序进行通信的程序,当前SOAP和REST之间的唯一区别是您是否在生成对话框中检查WSDL或JSON。我目前的所有开发工作都是针对REST服务,该服务似乎比SOAP灵活得多,而我对SOAP服务的兴趣已大大降低。我希望MANASYS Jazz的进一步开发仅用于REST,除非有人为该开发付费,否则SOAP将被抛在后面。我会谷歌"使用HttpClient消费REST服务,看看导致我的原因。

有什么建议吗?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
对于REST API,您必须知道要发布到的确切URL。无需特殊的SOAP信封。只需将JSON发布到URL,然后读取响应JSON。通常,使用HTTPClient最简单。

我倾向于将PostMan用于REST-ful API测试。
 

罗伯特·NZ

活跃的成员
已加入
2020年6月26日
留言内容
34
编程经验
Beginner
看起来不错。向我介绍HTTPClient是关键,我正在阅读有关此内容的各个页面,我认为HTTPClient与Newtonsoft.json一起为我提供了我现在需要的答案。谢谢跳伞运动员。我希望这不是我的最后一个问题  :)
 
最佳 底部