在Swift(iOS应用程序)中,将数据发布到具有[FromForm]参数并使用自动绑定的.net WebAPI的正确方法是什么?

izkcnapc  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(136)

请注意:不重复

在你决定我的问题是重复之前,请阅读所有这些,因为我已经搜索了答案并阅读了许多关于SO的文章,但没有一个解决了[FromForm] WebAPI绑定的问题。
我在Controller中有以下WebAPI方法:

  1. [HttpPost("SetScreenName")]
  2. public ActionResult SetScreenName([FromForm] String guid, [FromForm] String screenName)

字符串
用户可以简单地传入一个guid和一个screenName来设置用户配置文件的screenName。
我可以使用以下代码从JavaScript fetch轻松调用它:

  1. const formDataX = new FormData();
  2. formDataX.append("guid","fakeguid-here");
  3. formDataX.append("screenName", "newoneForTest");
  4. fetch("https://localhost:7103/User/SetScreenName", {
  5. method: 'POST',
  6. body: formDataX,
  7. })
  8. .then(response => response.json())
  9. .then(data => console.log(data));


现在,我需要知道如何使用Swift调用这个相同的WebAPI方法(在iOS App / SwiftUI中)

Here's What I've Tried

我已经试着通过这个几天,总是会得到错误从我的WebAPI指出,一个或两个参数(guid,screenName)丢失。
下面是一个SO答案列表和我试图从中得出答案的代码片段:

  1. swift url Session post request with parameters and image (Multipart Form-Data Requests )
  2. HTTP Request in Swift with POST method
    得到了以下代码,我部分使用了它,但仍然失败:注意:失败总是一个或两个参数都丢失。
  1. let url = URL(string: "https://httpbin.org/post")!
  2. var request = URLRequest(url: url)
  3. request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
  4. request.setValue("application/json", forHTTPHeaderField: "Accept")
  5. request.httpMethod = "POST"

  1. How can I build a URL with query parameters containing multiple values for the same key in Swift?
    尝试以下代码,但WebAPI只能识别第一个参数(guid):
  1. url.append(queryItems: [URLQueryItem(name: "guid", value: "\(guid)"), URLQueryItem(name: "screenName", value: "\(screenName)")])


1.如何在Swift中使用JSON body进行HTTP Post请求?
尝试使用该答案中的代码将参数编码为JSON:

  1. var outData = userData(uuid.uuidString.lowercased(), screenName)
  2. var je = JSONEncoder()
  3. guard let jsonData = try? je.encode(outData) else{
  4. print ("encode FAILURE!")
  5. return false
  6. }


结果数据如下:{"guid"="5c290f79-73a2-4bba-b34e-4d68c9d73ff7","screenName"="sallafootam"}
这些解决方案都不起作用,我的WebAPI总是指示一个或多个参数(guidscreenName)丢失。
使用Swift发布到我的WebAPI方法的最终设置是什么?

xwbd5t1u

xwbd5t1u1#

下面是我最终发现的最简单的设置,它适用于我的WebAPI和那些[FromForm]参数:

  1. request.httpMethod = "POST"
  2. var finalData = "guid=\(uuid.uuidString.lowercased())&screenName=\(screenName)"
  3. request.httpBody = finalData.data(using: String.Encoding.utf8)

字符串
请注意,这些值看起来像普通的QueryString,但您不能将它们添加到queryString中,因为它们不会绑定到WebAPI端。
它们必须被创建,就像我在上面的代码片段中展示的那样,然后添加到requesthttpBody中。

相关问题