У меня есть простой веб-сервис, который работает с клиентом C #, но выдает код состояния 400, когда я пытаюсь выполнить POST с клиентом Swift.
Пока я могу получить массив контрольных списковобъекты в Swift, которые возвращаются в следующем формате JSON:
data - - - Optional(["User": {
"Display_Name" = "<null>";
Email = "<null>";
"First_Name" = "Tester 0";
"Last_Name" = McTesterson;
Phone = "<null>";
"User_ID" = 1;
}, "Checklist_ID": 1, "Description": {
"Description_ID" = 1;
Summary = "test summary";
Title = "Test Title u.u";
}, "Status": {
State = 1;
"Status_ID" = 1;
}])
Когда я отправляю POST новый контрольный список, заголовок передается в URI запроса после .../checklist/create/
, а тело http / content являетсяодно значение для поля «Сводка».Он успешно делает это в C #, используя этот код:
public static void CreateChecklist(string title, string summary = "")
{
let url = $"/checklist/create/{title}/"
Post<string, string>(HttpMethod.Post, url, requestContent: summary);
}
private R Post<T, R>(HttpMethod ClientMethod, string methodUrl, object requestContent = default(object))
{
var httpClient = new HttpClient();
methodUrl = CHECKLIST_URL + methodUrl;
var request = new HttpRequestmessage()
{
RequestUri = new Uri(methodUrl),
Method = ClientMethod
};
// When uploading, setup the content here...
if (ClientMethod == HttpMethod.Post || ClientMethod == HttpMethod.Put)
{
string serializedContent = JsonConvert.SerializeObject(requestContent);
request.Content = new StringContent(serializedContent, Encoding.UTF8, "application/json");
}
// Process the response...
HttpResponseMessage response;
try
{
response = httpClient.SendAsync(request).Result;
}
catch (Exception ex)
{
while (ex.InnerException != null) ex = ex.InnerException;
throw ex;
}
if (response.IsSuccessStatusCode)
{
var tempContent = response.Content.ReadAsStringAsync().Result;
var r = JsonConvert.DeserializeObject<R>(tempContent);
return r;
}
else
{
throw new Exception("HTTP Operation failed");
}
}
Однако, когда я отправляю сообщение в Swift, возвращается ответ 400 и новый контрольный список не создается (см. Вывод консоли ниже).Вот код Swift, который я использую (объединенный в один метод):
func uglyPost<T: RestCompatible>(request: String,
for rec: T,
followUp: OptionalBlock = nil) {
guard let url = URL(string: request) else { followUp?(); return }
let g = DispatchGroup()
var request = URLRequest(url: url)
request.httpMethod = "POST"
// This is where the summary field is serialized and injected...
do {
let body = ["Summary": ""]
print(" isValid - \(JSONSerialization.isValidJSONObject(body))")
request.httpBody = try JSONSerialization.data(withJSONObject: body,
options: [])
request.setValue("application/json; charset=utf-8",
forHTTPHeaderField: "Content-Type")
} catch {
print(" Error @ CanSerializeJSONRecord")
}
// This is the actual POST request attempt...
let task = URLSession.shared.dataTask(with: request) { data, response, error in
print(" d - \n\(String(describing: data?.description))")
print(" r - \n\(String(describing: response))")
g.leave()
if let error = error {
print(" Error @ CanMakePostRequest - \(error.localizedDescription)")
return
}
}
// This is where asyncronous POST reequest is executed...
g.enter()
task.resume()
// Waiting for POST request to conclude before completion block
g.wait()
followUp?()
}
Кроме того, вывод консоли:
--http://-----.azurewebsites.net/api/-----/checklist/create/SwiftPostTests
isValid - true
d -
Optional("33 bytes")
r -
Optional(<NSHTTPURLResponse: 0x7fb549d0e300> { URL: http://-----.azurewebsites.net/api/-----/checklist/create/SwiftPostTests } { Status Code: 400, Headers {
"Content-Type" = (
"application/json; charset=utf-8"
);
Date = (
"Sat, 08 Dec 2018 22:57:50 GMT"
);
Server = (
K-----
);
"Transfer-Encoding" = (
Identity
);
"X-Powered-By" = (
"ASP.NET"
);
} })
fulfilling
/Users/.../SingleSequenceUglyPost.swift:79: error: -[*.SingleSequenceUglyPost testUglyFullSequence] : XCTAssertGreaterThan failed: ("307") is not greater than ("307") -
Мой URI правильный, а сервервверх, потому что я делаю вызовы GET успешно и могу POST от клиента C # Любая помощь по поводу того, почему я получаю код 400 или какими должны быть следующие шаги по устранению неполадок?