2016-03-21 2 views
0

Не уверен, как построить строку в swift, по-видимому. Я хотел бы послатьстрока, отправленная в неправильном формате

действие = категория & данных = { "ID": 2, "типа": "лист"}

как parameterstring в запросе. в XCode Я построить его так:

let actionstring = "\"id\":2,\"type\":\"sheet\"" 
parameters: ["action": "category", "data": actionstring] 

Если я печать (actionstring) я получаю именно то, что я хочу, но когда я отправить запрос, он выглядит следующим образом:

действие = категория & данные =% 22id% 22% 3A2% 2C% 22type% 22% 3A% 22sheet% 22

+1

Какая проблема является причиной этого? – Wain

+0

Как вы отправляете запрос? Если он находится в URL-адресе, посмотрите на этот ответ: [Символы, разрешенные в URL-адресе] (http://stackoverflow.com/a/1856809/887210) – ColGraff

+0

Вы не показали нам, как «actionString» был пропущен процентом (и вы, очевидно, сделали что-то, чтобы убежать от него), но вам не хватает '{' и '}', который, как вы сказали, вам нужен. Возможно, вы захотите добавить их в свой 'actionString', если вы действительно хотели, чтобы он выглядел как« action = category & data = {«id»: 2, «type»: «sheet»} '. Честно говоря, я не уверен, что вы так хотите. Как правило, вы отправляете его как 'action = category & data [id] = 2 & data [type] = sheet', как показано ниже, если вы не делаете что-то очень нестандартное в своем веб-сервисе. Трудно сказать без дополнительной информации о вашем веб-сервисе. – Rob

ответ

1

это верно для URL-процентов закодированной строки:

import Foundation 

let actionstring = "\"id\":2,\"type\":\"sheet\"" 
let parameters = ["action": "category", "data": actionstring] 

var string = "" 
for (index, parameter) in parameters.enumerate() { 
    string.appendContentsOf("\(parameter.0)=\(parameter.1)") 
    if index + 1 < parameters.count { string.append(Character("&")) } 
} 

print(string.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())) 
// => Optional("action=category&data=%22id%22%3A2,%22type%22%3A%22sheet%22") 
+1

FYI, 'URLHostAllowedCharacterSet' недостаточно для процентного экранирования. Если, например, значение содержало символы '+' или '&', это позволило бы им пройти без сохранения, что было бы проблематично. Если вы знаете, что таких символов не будет, вы можете уйти с 'URLHostAllowedCharacterSet', но обычно вам нужно вручную создать свой собственный набор символов или создать изменчивое исполнение' URLHostAllowedCharacterSet', а затем удалить соответствующие символы. См. Http://stackoverflow.com/a/35912606/1271826. – Rob

+1

Хороший звонок, я не понимал, что они были там. Благодаря! – ColGraff

1

Вообще, если вы хотите data быть получены в виде ассоциативного массива с помощью веб-службы в x-www-form-urlencoded запросе, вы могли бы сделать:

action=category&data[id]=2&data[type]=sheet 

Это приведет к data принимается как ассоциативный массив.

И, как уже отмечалось, если category, 2 или sheet значения имели какие-либо зарезервированные символы (в частности, пространство, + или & внутри этих значений может вызвать проблемы), вы бы процентов избежать тех.


Другой способ передачи структурированных данных, как это построить application/json запрос. Это зависит от того, что ожидает ваш веб-сервис (поскольку реализация этих веб-сервисов отличается для этих двух типов запросов). Я предполагаю, что ваш веб-сервис ожидает запроса x-www-form-urlencoded, но если вам нужна демонстрация запроса JSON, сообщите нам об этом.