#php #json #swift #post #error-handling
#php #json #swift #Публикация #обработка ошибок
Вопрос:
При выполнении запроса POST отладчик Xcode выдает ошибку
Ошибка Domain= NSCocoaErrorDomain Code = 3840 «Текст в формате JSON не начинался с массива или объекта, и параметр разрешить не устанавливать фрагменты». userInfo={NSDebugDescription= Текст в формате JSON не начинался с массива или объекта, и параметр разрешить не устанавливать фрагменты.}
Вот функция POST,
func startArchive() {
let app_Id = (appId.base64Decoded()!)
let job_Id = (jobId.base64Decoded()!)
var response_ = 0
guard let url = URL(string: "https://xxx.yyyy.com/question/abc") else {return}
let request = NSMutableURLRequest(url:url)
request.httpMethod = "POST"
let postString = "session_id=(pSessionId)amp;job_id=(job_Id)amp;app_id=(app_Id)amp;action=start"
print(postString)
request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
guard error == nil amp;amp; data != nil else { // check for fundamental networking error
print("error=(String(describing: error))")
return
}
do {
if let responseJSON = try JSONSerialization.jsonObject(with: data!) as? [String:AnyObject]{
print(responseJSON)
print(responseJSON["status"]!)
response_ = responseJSON["status"]! as! Int
print(response_)
//Check response from the sever
if response_ == 200
{
OperationQueue.main.addOperation {
print("Login Successful")
}
}
else
{
OperationQueue.main.addOperation {
print("Login Failed")
}
}
}
}
catch {
print("Error -> (error)")
}
}
task.resume()
}
Я пробовал с заголовком, но все равно появляется та же ошибка.
request.setValue(«текст / html; кодировка = UTF-8», для httpheaderfield: «Тип содержимого»)
Вот функция PHP для вышеупомянутого запроса,
public function abc(Request $request)
{ $session_id = !empty($request->input('session_id')) ? $request->input('session_id') : '';
$action = $request->input('action');
$archiveId = !empty($request->input('archive_id')) ? $request->input('archive_id') : '';
$data = array();
$opentok = new OpenTokOpenTok($_SERVER['TOKBOX_' . strtoupper($this->tenantName) . '_API_KEY'], $_SERVER['TOKBOX_' . strtoupper($this->tenantName) . '_SECRET']);
if ($action == 'start') { // Start recording
try {
// Create an archive using custom options
$archiveOptions = array(
'name' => 'Important Presentation', // default: null
'hasAudio' => true, // default: true
'hasVideo' => true, // default: true
'outputMode' => OpenTokOutputMode::COMPOSED // default: OutputMode::COMPOSED
);
$archive = $opentok->startArchive($session_id, $archiveOptions);
$job_id = $request->input('job_id');
$app_id = $request->input('app_id');
// check record exist or not
$check_archive = DB::table('practice_question_recordings')
->where('job_id', $job_id)
->where('app_id', $app_id)
->get();
if (empty($check_archive)) { // insert data
$insert_data = array();
$insert_data['job_id'] = $job_id;
$insert_data['app_id'] = $app_id;
$insert_data['archive_id'] = $archive->id;
$insert_data['archive_url'] = '';
DB::table('practice_question_recordings')->insert($insert_data);
} else { // Update data
$update_data = array();
$update_data['job_id'] = $job_id;
$update_data['app_id'] = $app_id;
$update_data['archive_id'] = $archive->id;
$update_data['archive_url'] = '';
DB::table('practice_question_recordings')
->where('job_id', $job_id)
->where('app_id', $app_id)
->update($update_data);
}
$data['status'] = 200;
$data['archive_id'] = $archive->id;
$data['message'] = 'Recording started successfully.';
} catch (Exception $ex) {
$data['status'] = 500;
$data['message'] = $ex->getMessage();
}
} else { // Stop recording
try {
$archive_detail = $opentok->stopArchive($archiveId);
$data['status'] = 200;
$data['archive_detail'] = $archive_detail;
$data['message'] = 'Recording stopped successfully.';
} catch (Exception $ex) {
$data['status'] = 500;
$data['message'] = $ex->getMessage();
}
}
return response()->json($data);
}
Комментарии:
1. можете ли вы опубликовать ожидаемый json?
2. Не могли бы вы распечатать
String(data: data: encoding: .utf8)
? Кроме того, вы можете добавитьapplication/json
для заголовка accepteted content type.3. Пожалуйста, добавьте фрагмент, а также результирующий json к вопросу вместо публикации в качестве комментария. Таким образом, вся важная информация собрана в одной точке.
4. Не могли бы вы распечатать
String(data: data: encoding: .utf8)
перед тем, как делатьJSONSerialization
? Не все разработчики iOS говорят на php (по крайней мере, я этого не делаю), но мы могли бы указать, в чем заключается проблема.5. HTML, поэтому не JSON. Я мог бы подумать, что у вас ошибка. Некоторая ошибка 404.
Ответ №1:
Итак, наконец, я смог обнаружить проблему. Проблема заключалась в поддомене части URL.
Поскольку я использовал идентификатор сеанса другого поддомена [OpenTok] и передавал его в качестве параметра в этом, появился код состояния 500.
Кроме того, я изменил структуру своей функции POST на это:
func startArchive() {
let app_Id = (appId.base64Decoded()!)
let job_Id = (jobId.base64Decoded()!)
let parameters: [String: Any] = ["session_id": pSessionId, "job_id":job_Id, "app_id":app_Id, "action":"start"]
print("Parameter:(parameters)")
guard let url = URL(string: "https://first.yyyy.com/question/abc") else {return}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("iOS", forHTTPHeaderField: "deviceType")
guard let httpbody = try? JSONSerialization.data(withJSONObject: parameters, options:[]) else {return}
request.httpBody = httpbody
let session = URLSession.shared
session.dataTask(with: request) {data, response, error in
if let response = response {
print(response)
}
if let data = data{
let mdata = String(data: data, encoding: .utf8)
print("This is data: (mdata!)")
do{
// print("(String(data: data, encoding: .utf8) ?? "")")
if let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary {
DispatchQueue.main.async {
_archiveId = (json["archive_id"] as! String)
print(json)
}
}
} catch {
print(error)
}
}
}.resume()
}
У меня все отлично сработало и вернуло данные в JSON.