swift post请求没有响应

swift post请求没有响应,swift,curl,post,urlsession,Swift,Curl,Post,Urlsession,需要执行post请求才能完成oauth2.0身份验证 它在卷曲中工作良好: curl -i -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw' https://fmsauth.scania.com/auth/S2S4DA/Cli

需要执行post请求才能完成oauth2.0身份验证

它在卷曲中工作良好:

curl -i -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw' https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge
我得到这样的回应:

{"challenge":"_jEEFcI36cvfMac8BHG8R0iIp4g7I-t0-C9LKAjwl9Y"}
我在swift中尝试了同样的方法,但没有得到任何回应:

import Foundation

let session = URLSession.shared
let url = URL(string: "https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let payload = Data("clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw".utf8)

let task = session.uploadTask(with: request, from: payload) { data, response, error in

    if let data = data, let dataString = String(data: data, encoding: .utf8) {
        print(dataString)
    }

    if let httpResponse = response as? HTTPURLResponse {
        print(httpResponse.statusCode)
    }
}

task.resume()

我认为负载数据字符串可能有问题。我不知道http post请求的“数据格式”在curl和swift中是什么样子。

更新1

好的,在阅读了你的评论之后,接下来发生了什么,程序在你的代码被执行之前就结束了。一个简单的方法是在代码中添加断点

您可以使用信号量阻止当前线程并等待URL会话完成

分派信号量是传统方法的有效实现 计数信号量。分派信号量只调用内核 当调用线程需要被阻塞时。如果调用信号量 不需要阻塞,不进行内核调用

此代码将执行您希望它执行的操作

var sema = DispatchSemaphore( value: 0 )
let session = URLSession.shared
let url = URL(string: "https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let payload = Data("clientId=cgoxyBxM1KVO3pLm5J7VgDVxlP7_33BpPlPXeIaSmoLsTZq8DfyM1svTwi-SU7KJKBRN4V3mIsV7pNNEg610Xw".utf8)

    let task = session.uploadTask(with: request, from: payload) { data, response, error in

        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            print(dataString)
             sema.signal()
        }

        if let httpResponse = response as? HTTPURLResponse {
            print(httpResponse.statusCode)
        }
    }

    task.resume()
    sema.wait()
第一篇文章

您的代码正常工作,我认为您需要启用传输。将此添加到info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>somethingthatshouldntworkyourdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
NSAppTransportSecurity
NSAllowsArbitraryLoads
NSExceptionDomains
一些不应该在yourdomain.com工作的东西
n包括多个域
N第三方例外要求转发保密
回应

Code 200

{"challenge":"eeABaKaf2ZdhPEVQ4ru2S58_j37VLetM3pryIP8uiXk"}
<NSHTTPURLResponse: 0x600003be73e0> { URL: https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge } { Status Code: 200, Headers {
    "Content-Encoding" =     (
        gzip
    );
    "Content-Length" =     (
        182
    );
    "Content-Type" =     (
        "application/json; charset=utf-8"
    );
    Date =     (
        "Wed, 15 Jan 2020 21:12:31 GMT"
    );
    Server =     (
        "Microsoft-IIS/8.5"
    );
    "Set-Cookie" =     (
        "BIGipServerfmsauth.scania.com_https_pool=!c+BZzlVtgeV0E7NCFLoANbUAp39TaIJT2kJgIPLs8cCAJ4R4UMhNbWVOiSnTd/Cx6OuLMGUfIpke3g==; path=/; Httponly; Secure"
    );
    Vary =     (
        "Accept-Encoding"
    );
    "X-HandlingWebServer" =     (
        sesofms9112
    );
    "X-Powered-By" =     (
        "ASP.NET"
    );
    "owin.RequestId" =     (
        "4dbeb043-0e55-4972-b955-45c28f94aa77"
    );
} }
code 200
{“挑战”:“eeABaKaf2ZdhPEVQ4ru2S58_j37VLetM3pryIP8uiXk”}
{URL:https://fmsauth.scania.com/auth/S2S4DA/ClientId2Challenge }{状态代码:200,标题{
“内容编码”=(
gzip
);
“内容长度”=(
182
);
“内容类型”=(
“application/json;charset=utf-8”
);
日期=(
“2020年1月15日星期三21:12:31 GMT”
);
服务器=(
“Microsoft IIS/8.5”
);
“设置Cookie”=(
“BIGipServerfmsauth.scania.com_https_pool=!c+BZzlVtgeV0E7NCFLoANbUAp39TaIJT2kJgIPLs8cCAJ4R4UMhNbWVOiSnTd/cx6oullmgufipke3g==;path=/;Httponly;安全”
);
变化=(
“接受编码”
);
“X-HandlingWebServer”=(
SESMS9112
);
“X-Powered-By”=(
“ASP.NET”
);
“owin.RequestId”=(
“4dbeb043-0e55-4972-b955-45c28f94aa77”
);
} }

是否添加了断点或检查了错误?您可以做的另一件事是使用Postman来测试您的API。我刚刚仔细检查了一下,没有断点,也没有警告或错误。脚本运行并显示“程序以退出代码0结束”。我会检查邮递员,谢谢:)非常感谢。我只是使用了一个Mac命令行工具项目,所以我没有plist文件,但我应该能够添加它:)顺便说一句,我只是想添加一点,它在iOS项目中工作,即使不更改plist文件。即使添加了plist文件,它在命令行工具项目中仍然不起作用,但可能我做错了什么。无论如何,我可以用这个,我只是想为其他人添加信息。