У меня есть действие веб-API ASP.NET, которое вызывается определенным приложением на устройствах iOS. Он отлично работает, когда он открыт в браузерах как на смартфонах, так и на настольных компьютерах. Однако приложение для смартфона не получает никакого ответа при вызове с httpMethod = GET
. А если я изменю iOS и сервер httpMethod
на POST
, все будет работать как задумано.
Код сервера:
[HttpGet("{uuid}")]
public async Task<ConfigurationProfileDto> Get([FromRoute]string uuid)
{
if (string.IsNullOrWhiteSpace(uuid))
return null;
var smartphone = _SmartphoneService.GetAll().FirstOrDefault(p => p.Uuid == uuid && p.StatusId == Data.Entities.SmartphoneStatusEnum.Active);
if (smartphone == null)
{
return null;
}
var profileDto = new ConfigurationProfileDto(smartphone.User.ConfigurationProfile);
return profileDto;
}
Код iOS:
public func requestSend() {
delegate?.managerDidStartLoading?(request: self.requestObject)
requestInitialization()
sessionInitialization()
let task = session?.dataTask(with: request! completionHandler: { data, response, error in
if error != nil {
self.delegate?.managerDidFailed(description: error!.localizedDescription, request: self.requestObject)
return
}
if let status = response as? HTTPURLResponse {
if status.statusCode == 200 {
self.delegate?.managerDidSuccessed(request: self.requestObject)
if let json = try? JSONSerialization.jsonObject(with: data! options: []) {
self.delegate?.managerDidReceived?(data: json, request: self.requestObject!)
}
}
else {
self.delegate?.managerDidFailed(description: "Server returns code \(status.statusCode)", request: self.requestObject)
}
}
})
task?.resume()
}
private func requestInitialization() {
if let urlString = requestURL,
let url = URL(string: urlString) {
request = URLRequest(url: url)
request?.addValue("application/json", forHTTPHeaderField: "Content-Type")
request?.addValue("application/json", forHTTPHeaderField: "Accept")
request?.httpMethod = "GET"
request?.timeoutInterval = 120
do {
request?.httpBody = try JSONSerialization.data(withJSONObject: requestParameter! options: .prettyPrinted)
}
catch let error {
delegate?.managerDidFailed(description: error.localizedDescription, request: self.requestObject)
}
}
else {
delegate?.managerDidFailed(description: "insufficent request parameters", request: self.requestObject)
}
}
Заголовок ответа:
transfer-encoding: chunked
content-type: application/json; charset=utf-8
server: Kestrel
date: Sun, 08 Apr 2018 05:23:44 GMT
Почему это не работает с httpMethod = GET
?
запрос GET не принимает BODY, в то время как POST/PUT принимает. Проблема заключается в том, как вы делаете запрос от клиента iOS. Если делать GET-запрос, то
httpBody
не может быть@Nkosi Отлично, спасибо. Теперь это исправлено!